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

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


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


 我们的爬取目标:

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

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

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

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


 一、网页源代码分析:

1、分析网站每页的网址

扫描二维码关注公众号,回复: 2540652 查看本文章

第一页的网址: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文件如下所示:

猜你喜欢

转载自www.cnblogs.com/shenpings1314/p/9417982.html