欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-30 11:53:50
天行健,君子以自强不息;地势坤,君子以厚德载物! 好了废话不多说,正式进入主题,前段时间应朋友的请求,爬取了某铝业网站上的数据。刚开始呢,还是挺不愿意的(主要是自己没有完整的爬取过网上的数据哎,即是不自信),但是在兄弟伙的面前不能丢脸卅,硬起头皮都要上,于是乎答应了他,好吧~~~~ 我们的爬取目标: ......

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


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


 我们的爬取目标:

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

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

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

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

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

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、分析每页网页的源代码

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

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

则,整体思路为:(1)拼接所有页的网址(http://www.chalco.com.cn/chalco/ywycp/cpbj/A120401web_1.html);

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

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


 二、Python源码

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

Python转页爬取某铝业网站上的数据
 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文件如下所示:

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