爬取赶集网类似数据的几个小技巧

爬取赶集网数据时发现一些有用的小技巧,不一定用到,先记下来备用。

一、代理服务器

有些网站服务器限制访问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)

posted @ 2020-03-21 16:16  djl_djl  阅读(260)  评论(0编辑  收藏  举报