zoukankan      html  css  js  c++  java
  • 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文件如下所示:


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


  • 相关阅读:
    设计模式系列
    Python3 系列之 可变参数和关键字参数
    设计模式系列
    【HANA系列】SAP HANA ODBC error due to mismatch of version
    【FICO系列】SAP FICO FS00修改科目为未清项目管理
    【FIORI系列】SAP OpenUI5 (SAPUI5) js框架简单介绍
    【HANA系列】SAP HANA SQL获取当前日期加若干天后的日期
    【HANA系列】SAP HANA SQL获取本周的周一
    【HANA系列】SAP HANA SQL获取当前日期
    【HANA系列】SAP HANA SQL获取当前日期最后一天
  • 原文地址:https://www.cnblogs.com/shenpings1314/p/9417982.html
Copyright © 2011-2022 走看看