• Python转页爬取某铝业网站上的数据


    天行健,君子以自强不息;地势坤,君子以厚德载物!


    好了废话不多说,正式进入主题,前段时间应朋友的请求,爬取了某铝业网站上的数据。刚开始呢,还是挺不愿意的(主要是自己没有完整的爬取过网上的数据哎,即是不自信),但是在兄弟伙的面前不能丢脸卅,硬起头皮都要上,于是乎答应了他,好吧~~~~


     我们的爬取目标:

    http://www.chalco.com.cn/chalco/ywycp/cpbj/A120401web_1.htm

    1、总共63页,每页有十几条的链接

    2、爬取连接里面的数据(主要有产品名称、规格、合同、华东市场、华南市场、西南市场、中原市场、产品报价时间)

    3、爬取的数据存为CSV格式


     一、网页源代码分析:

    1、分析网站每页的网址

    第一页的网址:http://www.chalco.com.cn/chalco/ywycp/cpbj/A120401web_1.html

    第二页的网址:http://www.chalco.com.cn/chalco/ywycp/cpbj/A120401web_2.html

    第三页的网址:http://www.chalco.com.cn/chalco/ywycp/cpbj/A120401web_3.html

    依次类推

    咱们可以发现第63页的网址是:http://www.chalco.com.cn/chalco/ywycp/cpbj/A120401web_63.html

    2、分析每页网页的源代码

    通过查看第一页的网页的源代码,可以发现,第一页上的每天的产品报价的链接。

    则,整体思路为

    (1)拼接所有页的网址(http://www.chalco.com.cn/chalco/ywycp/cpbj/A120401web_1.html);

    (2)解析出每页中的数据链接(<A href=/chalco/ywycp/cpbj/webinfo/2018/08/1533256568236442.htm target=_blank>中国铝业2018年8月3日产品报价</A>);

    (3)通过链接正则匹配出所需要的数据。


     二、Python源码

     此次爬取,使用的是request和re包!

     1 __Author__ = "MEET Shen"
     2 import requests
     3 import re
     4 import pandas as pd
     5 
     6 def get_allpage_url(n):
     7     '''
     8     得到所有页的连接
     9     '''
    10     totalpage_urls=[]
    11     for i in range(n):
    12         i=i+1
    13         url_change_page="http://www.chalco.com.cn/chalco/ywycp/cpbj/A120401web_{0}.htm".format(str(i))
    14         totalpage_urls.append(url_change_page)
    15     return totalpage_urls
    16 url=get_allpage_url(20)
    17 def get_datapage_url(data):
    18     '''
    19     http://www.chalco.com.cn/chalco/ywycp/cpbj/webinfo/2018/06/1530058323659676.htm
    20                             /chalco/ywycp/cpbj/webinfo/2018/06/1530058323659676.htm
    21     :return:
    22     '''
    23     #正则表达式进行解析出所有的数据连接
    24     pattern=re.compile('.*?</DIV><DIV class=cpbj-item-xz><A href=(.*?) target=_blank>.*?',re.S)
    25     items=re.findall(pattern,data)
    26     del items[0]
    27     result_url=[]
    28     for i in items:
    29         joint="http://www.chalco.com.cn{0}".format(i)
    30         result_url.append(joint)
    31     items_len=len(items)
    32     return result_url,items_len
    33 
    34 
    35 headers={"User-Agent":'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
    36                       ' (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 '
    37                       'Core/1.53.4482.400 QQBrowser/9.7.13001.400'}
    38 
    39 def get_everypage_data(result_url):
    40     response = requests.get(url=result_url, headers=headers)
    41     data = response.text
    42     pattern=re.compile('.*?<P><STRONG>日历时间:</STRONG>(.*?)</P>.*?'
    43                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
    44                        '<TD bgColor=#ffffff>(.*?) </TD>.*?'
    45                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
    46                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
    47                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
    48                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
    49                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
    50                        '<TD bgColor=#ffffff>(.*?)</TD>.*?'
    51                        ,re.S)
    52     items=re.findall(pattern,data)
    53     items1=list(items[0])
    54     items1[7] = items1[7].replace('<p>','')
    55     items1[7] = items1[7].replace('</p>','')
    56     items1[8] = items1[8].replace('<p>','')
    57     items1[8] = items1[8].replace('</p>','')
    58     items1[8] = items1[8].replace('&nbsp;</P>', '')
    59     items1[5] = items1[5].replace('<FONT size=3 face="Times New Roman">', '')
    60     items1[5] = items1[5].replace('</FONT>', '')
    61     items1[6] = items1[6].replace('<FONT size=3 face="Times New Roman">', '')
    62     items1[6] = items1[6].replace('</FONT>', '')
    63     items1[7] = items1[7].replace('<FONT size=3 face="Times New Roman">', '')
    64     items1[7] = items1[7].replace('</FONT>', '')
    65     items1[8] = items1[8].replace('<FONT size=3 face="Times New Roman">', '')
    66     items1[8] = items1[8].replace('</FONT>', '')
    67     return items1
    68 
    69 
    70 def get_asignpage_data():
    71     items = []
    72     for i in range(len(url)):
    73         response = requests.get(url=url[i], headers=headers)
    74         data = response.text
    75         result_url,items_len = get_datapage_url(data)
    76         for i in range(items_len):
    77             item=get_everypage_data(result_url[i])
    78             items.append(item)
    79     return items
    80 
    81 items=get_asignpage_data()
    82 
    83 #存为CSV格式
    84 import pandas as pd
    85 data=pd.DataFrame(items,columns={'time','产品名称','规格','合同','中铝企业','华东市场','华南市场','西南市场','中原市场'})
    86 print(data)
    87 data.to_csv('C:/Users/Administrator/PycharmProjects/untitled/data/lvye1.csv',sep=',')
    View Code

    三、爬取的最终结果

    由于数据不很大,爬取的速度还是能够接受的,最终爬取的数据,且形成的CSV文件如下所示:


    笔者还处于学习的状态,如有写得不够专业或有错误的地方,真心希望各位读者前来探讨!!!!!


  • 相关阅读:
    2017.7.27
    js 变量那些事
    JS初学之-效果没出来怎么办?-alert函数测试
    JS初学之-循环生成坐标
    JS初学之-if else图片顺序及循环切换
    JSP笔记与案例一览(JSP后半部分)
    Java基础一览(会不断补充)
    session和cookie一览
    request和response一览
    封装含义一览
  • 原文地址:https://www.cnblogs.com/shenpings1314/p/9417982.html
Copyright © 2020-2023  润新知