今天要抓取的是百思不得姐,网址是‘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_qself.item_q = item_qself.img_q = img_qdef parse_url(self,url):response = requests.get(url,headers=headers)resp = response.content.decode()html=etree.HTML(resp)li_list=html.xpath("//div[@class='j-r-list']/ul/li")for li in li_list:item={}# 用户姓名username=li.xpath(".//div[@class='u-txt']/a/text()")# 文章标题title=li.xpath(".//div[@class='j-r-list-c-desc']/a/text()")# 图片的urlimg_url=li.xpath(".//div[@class='j-r-list-c-img']/a/img/@data-original")# 发布时间pub_date = li.xpath(".//div[@class='u-txt']/span/text()")# 点赞数up = li.xpath('.//div[@class="j-r-list-tool-l "]//li[1]/span/text()')down = li.xpath('.//div[@class="j-r-list-tool-l "]//li[2]/span/text()')# print(up)print(down)imgs_url = ''.join(img_url)self.img_q.put(imgs_url)item={'username': username,'title': title,'img_url': img_url,'pub_data':pub_date,'uo':up,'down':down,}self.item_q.put(item)def run(self):while True:if self.page_q.empty():breakurl = self.page_q.get()self.parse_url(url)

在生产者的init的方法接收三个队列,方便往里面增加或者取出数据,用xpath提取我们想要的数据,
转化为字典,因为请求地址和文件保存是IO操作,利用多线程可以大幅度提高效率。
好了,就先写到这,下面上完整的代码

# coding=utf-8
import requests
from lxml import etree
import json
import threading
from queue import Queue
import os
headers ={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"}
lock = threading.Lock()
# 生产者
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_qself.item_q = item_qself.img_q = img_qdef parse_url(self,url):response = requests.get(url,headers=headers)resp = response.content.decode()html=etree.HTML(resp)li_list=html.xpath("//div[@class='j-r-list']/ul/li")for li in li_list:item={}# 用户姓名username=li.xpath(".//div[@class='u-txt']/a/text()")# 文章标题title=li.xpath(".//div[@class='j-r-list-c-desc']/a/text()")# 图片的urlimg_url=li.xpath(".//div[@class='j-r-list-c-img']/a/img/@data-original")# 发布时间pub_date = li.xpath(".//div[@class='u-txt']/span/text()")# 点赞数up = li.xpath('.//div[@class="j-r-list-tool-l "]//li[1]/span/text()')down = li.xpath('.//div[@class="j-r-list-tool-l "]//li[2]/span/text()')# print(up)print(down)imgs_url = ''.join(img_url)self.img_q.put(imgs_url)item={'username': username,'title': title,'img_url': img_url,'pub_data':pub_date,'uo':up,'down':down,}self.item_q.put(item)def run(self):while True:if self.page_q.empty():breakurl = self.page_q.get()self.parse_url(url)# 消费者
class Consumer(threading.Thread):def __init__(self, page_q, item_q, img_q,*args, **kwargs):# 重写__init__方法 并调用父类的方法super(Consumer, self).__init__(*args, **kwargs)self.page_q=page_qself.item_q=item_qself.img_q = img_q# 保存用户的内容到json数据 以 a的方式追加def save_content(self,item,i):con_json=json.dumps(item, ensure_ascii=False, indent=2)with open('123.json', 'a', encoding='utf-8') as f:# 上锁 调用acquire方法lock.acquire()f.write(con_json)lock.release()print('-----------------保存成功%d------------------' % i)# 下载保存图片def save_img(self,img_url,item):# 保存图片res = requests.get(img_url,headers=headers)# 取文件后缀suffxi = os.path.splitext(img_url)[1]file_name =item.get('username')file_name = 'images3/'+''.join(file_name)+suffxiwith open(file_name ,'wb') as f:# 加锁lock.acquire()f.write(res.content)# 释放锁lock.release()# 主要逻辑处理def run(self):i = 0while True:if self.page_q.empty() and self.item_q.empty() and self.img_q.empty():breakitem = self.item_q.get()img_url = self.img_q.get()self.save_content(item,i)self.save_img(img_url,item)i+=1def 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()if __name__ == '__main__':main()

这里用了 os模块的 splittext方法他可以把一个文件名分开 比如 '123,txt’用这个方法后会返回一个(123,.txt)这样的元组 我们只需要取下标为1的数据就能取到后缀名,保存的时候效果如下

这样看到图片就能一目了然知道是哪个用户,是不是很直观呢,好了,今天就先写到这里,如果有
什么疑问,评论区见。

使用python的requests模块实现百思不得其姐抓取(多线程版)相关推荐

  1. 关于python中requests模块导入问题-python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

  2. python的requests模块功能_python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

  3. python怎么爬取Linux作业,Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗...

    介绍 本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容. 为了知道POST方法所需要传递的HT ...

  4. Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗

    介绍   本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容.   为了知道POST方法所需要传 ...

  5. Python爬虫---requests模块的基本使用

    Python爬虫-requests模块的基本使用 基础 什么是爬虫? 就是通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程. 爬虫的分类 通用爬虫 抓取互联网中的一整张页面数据 聚焦爬虫 ...

  6. python如何导入requests模块_浅谈python中requests模块导入的问题

    浅谈python中requests模块导入的问题 今天使用Pycharm来抓取网页图片时候,要导入requests模块,但是在pycharm中import requests 时候报错. 原因: pyt ...

  7. 说说如何利用 Python 的 requests 模块,从网络下载电子小说

    利用 Python 的 requests 模块可以很容易从网络下载电子小说,甚至可以处理 https 连接!首先必须先安装该模块. 通过命令行,运行 -> pip install request ...

  8. python实现食品推荐_通过Python语言实现美团美食商家数据抓取

    首先,我们先来打开美团美食商家页面,来分析一下. 如上面所提供的URL即为美团美食商家页面.或者我们通过美团官网打开一个美团美食商家页面,打开步骤如下:1.打开浏览器,输入 即可打开美团北京首页 2. ...

  9. Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程

    Scrapy是一个用于爬行网站以及在数据挖掘.信息处理和历史档案等大量应用范围内抽取结构化数据的应用程序框架,广泛用于工业. 在本文中我们将建立一个从Hacker News爬取数据的爬虫,并将数据按我 ...

  10. python爬取app播放的视频,Python爬虫工程师必学——App数据抓取实战视频教程

    爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统数据抓取.本课程主要为同学讲解如何用python实现App数据抓取,课程从开发环境搭建,App爬虫必备利器详解,项目实战,到最后的多App ...

最新文章

  1. 推荐一个Android Studio很实用的插件android-butterknife-zelezny
  2. Python 学习笔记(3)对txt文件的读与写操作(上)
  3. uni app 调用网络打印机_前端工程师 | 原生小程序坑点:uni-app到底好用在哪里?...
  4. c# Application.DoEvents
  5. 一步一步的写出你自己的makefile文件
  6. python支持list类型吗_Python-不支持的操作数类型为%:“list”和“int”
  7. Win7 U盘安装Ubuntu16.04 双系统
  8. .Net Core控制台应用加载读取Json配置文件
  9. android sdk 文档导读之前传:初涉
  10. app架构师实践指南pdf,分享一些行业经验,看完这一篇你就懂了
  11. 龙芯3a5000下编译postgresql 14.3
  12. 斐讯dc1服务器什么时候修复,[4月1日更新!!]斐讯DC1插座自制固件接入ha
  13. Ubuntu常用软件安装与问题解决(持续更新)
  14. 武汉大学计算机学院李明,第一届全国SLAM技术论坛在浙江大学成功举办
  15. python基础(第九章)面向对象
  16. msm8909 关于能否分别控制充电电流和USB输出电流问题 (温度问题)
  17. 个人对爬虫框架的一些认知(四)
  18. 综合性实验:停车场管理程序
  19. STM32H7不完全填坑教程系列
  20. 搞搞电脑微信表情的破解(.dat转png or jpg)

热门文章

  1. 魔兽地图服务器修改,魔兽争霸3冰封王座地图编辑器修改无限人口的方法
  2. 三维可视化技术在智慧电厂中的作用
  3. tensorflow中gpu和cpu切换
  4. 春江花朝秋月夜,往往取酒还独倾——python函数进阶
  5. Windows找回磁盘被病毒感染后隐藏的文件
  6. 关于getdate()的不同的日期格式
  7. 回炉重造之重读Windows核心编程-003-内核对象
  8. opencv 裁剪 java_OpenCV3 Java图像裁剪(Trimming Rect)
  9. 《概率论与数理统计》学习笔记
  10. 统一网络存储NAS+SAN=FAS