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= 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(' </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=',')
三、爬取的最终结果
由于数据不很大,爬取的速度还是能够接受的,最终爬取的数据,且形成的CSV文件如下所示:
上一篇: 最好不要惹女人