今天要抓取的是百思不得姐,网址是‘http://www.budejie.com/’,先明确一下我们的步骤和使用的模块
一 、使用的python模块 requests,lxml,json,queue,threading,os
1 requests模块主要用来发起请求,获得响应。
2 lxml模块的etree可以用xpath提取数据。
3 json模块把python的字典转化为字符串,保存数据
4 os 模块 处理文件名
5 threading和queue模块实现多线程
首先打开chrome浏览器,进入百思不得姐的首页
我们的目标是爬取前50页面所有用户的 昵称 标题 图片 点赞的数量 踩的数量 以及消息发布的时间
分析url地址的变化情况发现第二页的url是‘http://www.budejie.com/2’。
通过多翻几页后,不难发现,url地址的变化规律与当前页数有关
再通过抓包地址分析DOM结构,发现每个用户的信息都在ul下面的li下
我们需要通过xpath提取的用户的信息都在li标签里
,ok开始写代码。
注意了,由于是多任务实现的 记得要给线程加锁
def main():
# 页码url的队列
page_q = Queue(100)
# 获取到内容的队列
item_q = Queue(1000)
# 图片的队列
img_q = Queue(1000)
url = 'http://www.budejie.com/{}'
for i in range(1,50):
page_q.put(url.format(i))
for x in range(5):
pr = Producer(page_q,item_q,img_q)
pr.start()
for x in range(5):
co = Consumer(page_q,item_q,img_q)
co.start()
在main函数中是我们的启动函数 创建了5个生产者,5个消费者,url通过format方法配合循环进行构造,构造完成就把它放入页面的url的队列中。
class Producer(threading.Thread):
def __init__(self,page_q,item_q,img_q,*args,**kwargs):
super(Producer, self).__init__(*args,**kwargs)
self.page_q = page_q
self.item_q = item_q
self.img_q = img_q
def parse_url(self,url):
response = requests.get(url,headers=headers)
resp