2019独角兽企业重金招聘Python工程师标准>>>

狗年开工毫无工作心情,胡思乱想后决定爬取豆瓣上的一下信息打发时间,毕竟之前基本没接触过爬虫,还是挺感兴趣的。

Scrapy简介

首先简单介绍一下Scrapy爬虫框架,主要是架构方面,这方面能快速理解scrapy是如何工作的。

Scrapy的数据流由执行引擎(Engine)控制,其基本过程如下:

  1. 引擎从Spider中获取到初始Requests。
  2. 引擎将该Requests放入调度器,并请求下一个要爬取的Requests。
  3. 调度器返回下一个要爬取的Requests给引擎
  4. 引擎将Requests通过下载器中间件转发给下载器(Downloader)。
  5. 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
  6. 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
  7. Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
  8. 引擎将(Spider返回的)爬取到的Item交给ItemPipeline处理,将(Spider返回的)Request交给调度器,并请求下一个Requests(如果存在的话)。
  9. (从第一步)重复直到调度器中没有更多地Request。

使用Scrapy创建的项目架构如下

其中:

  1. spider 文件夹编写自己的爬虫;
  2. settings.py 配置爬虫的默认信息,功能开关,中间件执行顺序等;
  3. middlewares.py 中间件,主要是对功能的拓展,添加自定义功能,比如user-agent和proxy
  4. item.py 定义抓取处理的字段
  5. piplines.py 管道文件,处理item

爬取豆瓣小组

豆瓣小组的帖子主要核心内容是图片,因此要按不同的帖子分类下载。

settings.py

设置了user-agent,指定了中间件和piplines

BOT_NAME = 'douban'SPIDER_MODULES = ['douban.spiders']
NEWSPIDER_MODULE = 'douban.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'douban (+http://www.yourdomain.com)'# Obey robots.txt rules
ROBOTSTXT_OBEY = FalseMY_USER_AGENT = ["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)","Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)","Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0","Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20","Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1","Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5","Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre","Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11","Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",]
DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,'douban.middlewares.MyUserAgentMiddleware': 400,
}
COOKIES_ENABLES = True
DOWNLOAD_DELAY=1
ITEM_PIPELINES = {'douban.pipelines.DoubanPipeline': 1,
}

item.py

定义字段,包括作者,帖子名称,作者主页地址,图片地址

class DoubanItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()title=scrapy.Field()author=scrapy.Field()author_homepage=scrapy.Field()img_url=scrapy.Field()pass

middlewares.py

设置user-agent

class MyUserAgentMiddleware(UserAgentMiddleware):'''设置User-Agent'''def __init__(self, user_agent, ip):self.user_agent = user_agentself.ip=ip@classmethoddef from_crawler(cls, crawler):return cls(user_agent=crawler.settings.get('MY_USER_AGENT'), ip=crawler.settings.get('PROXIES'))def process_request(self, request, spider):agent = random.choice(self.user_agent)request.headers['User-Agent'] = agent

spiders/douban_spider.py

爬虫的处理代码,先登录然后爬取,如果有验证码,下载图片然后输入验证码

import urllibimport scrapy
from scrapy import Request, FormRequestfrom douban.items import DoubanItem
import jsonclass DoubanSpider(scrapy.Spider):name = 'douban'allowed_domains = ['douban.com']start_urls = []def start_requests(self):yield Request("https://www.douban.com/login", callback=self.parse, meta={"cookiejar":1})def parse(self, response):captcha = response.xpath('//img[@id="captcha_image"]/@src').extract()if len(captcha)>0:print("此时有验证码")localpath = "E:/spider/douban/captchar.jpg"urllib.request.urlretrieve(captcha[0],filename=localpath)print("请查看本地验证码图片并输入验证码")captcha_value=input()data = {"form_email": "*******@126.com","form_password": "*******","captcha-solution": str(captcha_value),"redir": "https://www.douban.com/group/haixiuzu/discussion?start=0"  # 登录后要返回的页面}else:print("此时没有验证码")data = {"form_email": "nofree1990@126.com","form_password": "8296926",# "redir": "https://www.douban.com/group/haixiuzu/discussion?start=0"  # 登录后要返回的页面}print("登陆中...")yield FormRequest.from_response(response,meta={"cookiejar": response.meta["cookiejar"]}, formdata=data, callback=self.parse_redirect)def parse_redirect(self, response):print("已登录豆瓣")title = response.xpath('//title//text()').extract()baseurl='https://www.douban.com/group/haixiuzu/discussion?start='for i in range(0, 625, 25):pageUrl=baseurl+str(i)yield Request(url=pageUrl, callback=self.parse_process,dont_filter = True)def parse_process(self, response):title = response.xpath('//title//text()').extract()items = response.xpath('//td//a/@href').extract()for item in items:if 'topic' in item:url=itemyield Request(url=item,callback=self.parse_img)def parse_img(self,response):img = DoubanItem()title=response.xpath('//title//text()').extract()img['title']=titleauthor=response.xpath('//div[@class="topic-doc"]//h3//a//text()').extract()img['author']=authorauthor_homepage = response.xpath('//div[@class="topic-doc"]//h3//a/@href').extract()img['author_homepage'] = author_homepageimg_url = response.xpath('//div[@class="image-wrapper"]//img/@src').extract()img['img_url'] = img_urlyield img

piplines.py

在此保存帖子信息,没有使用自带的保存图片的类主要原因是不够灵活。

class DoubanPipeline(object):def process_item(self, item, spider):author=item["author"][0]title=item["title"][0].replace('\n','').strip()author_homepage=item["author_homepage"][0]#路径dir="E:/spider/douban/img/"if not os.path.exists(dir):os.mkdir(dir)author_dir=dir+titleif not os.path.exists(author_dir):os.mkdir(author_dir)#用户信息txtinfo=open(author_dir+"/用户信息.txt", "w")info.write(author+'\n'+author_homepage)info.close()#保存图片count=1for url in item["img_url"]:path=author_dir+"/"+str(count)+".jpg"urllib.request.urlretrieve(url, filename=path)count += 1return item

爬虫结果

遇到的问题

主要问题就是爬取太频繁而被禁止,登录豆瓣也是想减少被禁止概率,但是发现没什么用。网上有很多解决方案,还是要伪造一些user-agent,使用proxy代理。也爬取过一些proxy存到数据库中,但是proxy比较慢,遂放弃。

转载于:https://my.oschina.net/M97hQfT2SJQ/blog/1629257

Scrapy爬取豆瓣小组图片相关推荐

  1. python爬取豆瓣电影top250_【Python3爬虫教程】Scrapy爬取豆瓣电影TOP250

    今天要实现的就是使用是scrapy爬取豆瓣电影TOP250榜单上的电影信息. 步骤如下: 一.爬取单页信息 首先是建立一个scrapy项目,在文件夹中按住shift然后点击鼠标右键,选择在此处打开命令 ...

  2. scrapy爬取豆瓣top250电影数据

    scrapy爬取豆瓣top250电影数据 scrapy框架 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. sc ...

  3. 用SCRAPY爬取豆瓣

    用SCRAPY爬取豆瓣 Items.py import scrapyclass Douban1Item(scrapy.Item):# define the fields for your item h ...

  4. Scrapy爬取豆瓣图书详情存入CSV并导入MySQL

    目录 前言 一.新建爬虫工程 二.修改settings.py文件 三.编写items.py 四.编写pipelines.py 五.编写book.py 六.存储到MySQL 七.爬取结果 八.后言 前言 ...

  5. python selenium爬虫豆瓣_使用selenium+requests爬取豆瓣小组讨论列表

    获取本文代码 · 我的GitHub 注:这个项目的代码会在我的GitHub持续优化.更新,而在本文中的代码则是最初版本的代码. 豆瓣小组 豆瓣有一个"小组"模块,有一些小组中会发布 ...

  6. scrapy爬取豆瓣所有电影信息(新手入门超详细版)

    本次小实验目标就是爬取豆瓣所有的电影,我们以豆瓣的分类页(https://movie.douban.com/tag/#/)作为start_urls,首要任务就是分析当前页面是否为动态加载,何为js动态 ...

  7. python爬虫,Scrapy爬取豆瓣电影《芳华》电影短评,分词生成词云图。

    项目github地址:https://github.com/kocor01/scrapy_cloud Python版本为3.6 自己写的简单架构<python爬虫,爬取豆瓣电影<芳华> ...

  8. python爬取豆瓣电影top250_Python爬虫 - scrapy - 爬取豆瓣电影TOP250

    0.前言 新接触爬虫,经过一段时间的实践,写了几个简单爬虫,爬取豆瓣电影的爬虫例子网上有很多,但都很简单,大部分只介绍了请求页面和解析部分,对于新手而言,我希望能够有一个比较全面的实例.所以找了很多实 ...

  9. python scrapy爬取豆瓣即将上映电影用邮件定时推送给自己

    本文不是python.scrapy的教程,而是分享一个好玩的点子. python教程请看python教程,scrapy教程请看scrapy教程 爬取豆瓣高分电影教程参考python爬虫入门笔记:用sc ...

最新文章

  1. linux Mysql 安装
  2. 12306新版上线 还是不能选上下铺
  3. vs2010 将.mc编译为.rc文件
  4. 自动化机器学习(二)自动构建机器学习流水线
  5. 没有足够多的数据怎么办?计算机视觉数据增强方法总结
  6. Delphi编写后台监控软件
  7. git如何merge github forked repository里的代码更新?
  8. mysql-数据库操作
  9. Mysql处理海量数据时的一些优化查询速度方法
  10. 信息学奥赛一本通(1186:出现次数超过一半的数)
  11. 华为p10plus能用鸿蒙吗,鸿蒙系统第四批什么时候 华为鸿蒙系统第四批 鸿蒙系统第四批升级机型介绍...
  12. [原创]关于comsenz 公司 系列论坛类型开源网站搭建的心得
  13. Linux笔记(十二) Linux集群搭建(附带视频详解)
  14. word怎么转pdf,word批量转pdf方法
  15. 屡败屡战,攻克中项(系统集成项目管理师考试经历分享)
  16. 3DMAX零基础图文教程学习
  17. 从五个维度来谈谈视觉设计师如何阐述设计风格
  18. java swing 圆形图标_java swing 圆形按钮
  19. python 常用库收集
  20. 如何删除数据库中重复的记录

热门文章

  1. Verilog第五章
  2. html大赛ppt,HTML表与表单.ppt
  3. glc四驱软件测试,四条腿一定跑得快?新款奔驰GLC四驱系统可不答应?
  4. 车载导航仪GPS开发基础
  5. 调研显示,有74%的企业计划发放2022年终奖,平均1.8倍月薪、人均2.19万元 | 美通社头条...
  6. 今年最火爆的商业模式,九星创客新零售模式
  7. 福利时刻 十年网络安全大佬的Web安全技术分享
  8. 【环境配置】临时更改pip源至清华、阿里、中科大镜像
  9. 目前世界上最好的卫星地图查看站 Atlas 提供更好的地图
  10. 使用性能测试工具TAU测试MPI程序记录