python3爬取网站数据
1.原文格式
2.需求:多个tr
中获取他们td
里的值,并保存数据
3.实现
import re
import urllib.request
from urllib.parse import urlencode
import csv
import time
def get_one_page(url, page):
#加头信息,User-Agent是有时候对方可能为了防爬虫做了判断,所以最好加上
#content-type 传参x-www-form-urlencoded时需要加上
headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
#尽量少的次数查更多的数据 观察目标每页最多可展示多少条数据
postdata = {
"currentpage":page,
"pagesize":40
}
data = urlencode(postdata).encode('utf-8')
req = urllib.request.Request(url, data=data, headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
return html
def save_one_page(data):
f = open('data.csv','a+',encoding='utf-8')
csv_writer = csv.writer(f)
for item in data:
usedata = []
for i in item:
usedata.append(i)
csv_writer.writerow(usedata)
f.close()
def parse_one_page(html):
#正则改了好久好久 有换行 换行后有空格
pattern = re.compile('<tr.*?color:#535353.*?>[\s\S].*<td.*?> ([\s\S]*?)</td>[\s\S].*<td.*?>[\s\S].*<a.*?id="(.*?)".*?>[\s\S] *([\s\S]*?)[\s\S].*</a></td>[\s\S].*<td.*?>[\s\S].*<a.*?>[\s\S] *([\s\S]*?)[\s\S].*</a></td>[\s\S].*<td.*?>[\s\S].*<a.*?>[\s\S] *([\s\S]*?)[\s\S].*</a>[\s\S].*</td>[\s\S].*<td.*?><a.*?>([\s\S]*?)</a></td>[\s\S].*<td.*?><a.*?>([\s\S]*?)</a></td>[\s\S].*</tr>')
items = re.findall(pattern, html)
return items
def main():
url = 'http://www.****'
for i in range(1,30):
html = get_one_page(url, i)
#下方为什么替换字符串,看下边
html = (html.replace("\r\n","\n"))
html = (html.replace("\t",""))
data = parse_one_page(html)
save_one_page(data)
#睡几秒,原因是如果对方做了接口限频
#或者,被封IP了怎么办
time.sleep(3)
print(i)
main()
这里为什么要替换字符串,讲讲故事
原网站速度很慢,所以把源码复制下来放自己网站,先匹配自己网站
自己的爬成功后,换成人家的url后,发现匹配出的内容为空
问题出在了哪里,一晚上,肉眼直接看愣是不会发现,之前也没复制出来匹配过
解决:把从复制的和人家网站获取的网页内容分别保存到txt文件中观察
发现文件大小不一样,复制的内容会把人家原本的\r\n和\t去掉
为了方便,已经写好的正则就没改了,直接把人家原本的html替换了字符串