爬取赶集网类似数据的几个小技巧
爬取赶集网数据时发现一些有用的小技巧,不一定用到,先记下来备用。
一、代理服务器
有些网站服务器限制访问IP的数量,即1个IP过多的访问网站则会被屏蔽,这是就需要设置多个代理地址,来模拟多IP访问的情况。
1、 首先从网上获取可使用的代理服务器地址,获取代理地址的网站(IP和端口):
http://cn-proxy.com/ # 别人给的,打不开页面
http://http.zhiliandaili.cn/ #自己搜的,也没测试可用性
2、 使用方法:
proxy_list = [
‘http:// 115.219.113.65: 19303’,
‘http:// 61.188.26.120: 20893’,
‘http:// 115.219.123.12: 15789’,
]
proxy_ip = random.choice(proxy_list) # 之前需要import random
proxies = {‘http’: proxy_ip}
wb_data = requests.get(url, headers=headers,proxies=proxies)
二、某字段需要多个同级元素的内容合成
比如,area字段需要从li元素下的3个a元素的内容来合成,直接取li元素的get_text()会取到多余的内容,则可以使用下面的方法:
area = list(map(Lambda x:x.text, soup.select(‘ul.det-infor>li:nth-of-type(3)>a’)))
# select(‘ul.det-infor>li:nth-of-type(3)>a’) 取出3个a元素,map函数实现将3个a元素放进lambda函数中处理,即取得内容,最后用list将对象变成列表
三、某字段需要某个元素下所有元素的内容合成
如:div元素中所有子孙级元素的多段文字内容,共同构成所需字段,用stripped_strings处理,即:area = list(soup.select('div.nav')[0].stripped_strings)
四、对抓取商品详细信息时中断的处理
若抓取商品详细信息时中断,不知从何开始,可在商品信息表p_info中增加一个字段url;然后做如下处理,之后只爬取没有爬过的商品信息,即rest_of_urls:
db_urls = [item['url'] for item in url_list.find()] # 用列表解析式装入所有要爬取的链接
index_urls = [item['url'] for item in p_info.find()] #商品详情信息数据库中所有的现存的 url 字段
x = set(db_urls) # 转换成集合的数据结构
y = set(index_urls)
rest_of_urls = x-y # 相减
五、对解析过程中报错的容错
1、 加if else的描述,如:
title = soup.select('h1.title-name')[0].get_text() if soup.select('h1.title-name') else None
2、 加try except, 如:
try:
item = item_info.find({'url': url})
except Exception as ex: # 将异常输出,帮助调试
print(ex)