基于scrapy框架的爬虫详细步骤(含没有“下一页”按钮的href抓取)
脱离八爪鱼,最近两天用scrapy爬了一个商品网站,本来可以快很多的,其中有一天把时间花在一行代码上最后绕了一大圈改了个参数就解决了??希望大家少走点弯路。
很多都是对慕课网的一个总结,网址:https://www.imooc.com/video/17519
讲得非常好!
比较敏感所以用课程的代码例子了。
第一次写,难免不专业多多指教。
1.新建项目
第一步先安装,可以按照视频上安装,略。
例子中,我们要爬的是:https://movie.douban.com/top250
首先:
scrapy startproject douban
就创建好了一个文件夹叫douban
在cmd上进入到douban文件夹中cd douban
,再进入子目录cd douban/
好的,现在我们需要与网站相关联的一个包,cmd输入
scrapy genspider douban_spider movie.douban.com
然后我们就可以用pycharm或者sublime把包导进去check一下
不要紧张,如果你的和我不一样,那么应该在douban目录下新建一个文件叫main.py
找到Settings.py文件 -> 找到被#掉的user agent -> (这个不是真正的user agent,我们需要打开https://movie.douban.com/top250,win直接F12,Mac就option+command+I ,打开检查栏)
把黑字复制了拷在settings.py上的user agent后面就好,别忘了去掉注释
2.快捷运行
在main.py文件中,让他代替终端的功能,在环境中运行就好
from scrapy import cmdline
cmdline.execute('scrapy crawl douban_spider'.split())
3. 修改douban_spider.py
先贴上源码
# -*- coding: utf-8 -*-
import scrapy
from douban.items import DoubanItemclass DoubanSpiderSpider(scrapy.Spider):name = 'douban_spider'allowed_domains = ['movie.douban.com']start_urls = ['http://movie.douban.com/top250']def parse(self, response):movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li") for i_item in movie_list:douban_item = DoubanItem()douban_item['serial_number'] = i_item.xpath(".//div[@class='item']/div[@class='pic']/em/text()").extract_first()douban_item['movie_name'] = i_item.xpath(".//div[@class='info']/div[@class='hd']/a/span[1]/text()").extract_first()content = i_item.xpath(".//div[@class='info']/div[@class='bd']/p[1]/text()").extract()for i_content in content:content_s = "".join(i_content.split())douban_item['introduce'] = content_sdouban_item['star'] = i_item.xpath(".//span[@class='rating_num']/text()").extract_first()douban_item['evaluate'] = i_item.xpath(".//div[@class='star']//span[4]/text()").extract_first()douban_item['describe'] = i_item.xpath(".//p[@class='quote']/span/text()").extract_first()yield douban_itemnext_link = response.xpath("//span[@class='next']/link/@href").extract()if next_link:next_link = next_link[0]yield scrapy.Request("http://product.asmag.com.cn"+next_link,callback=self.parse)
首先导入两个包
import scrapy
from douban.items import DoubanItem
然后稍作修改:把start_urls改为我们的代码头,什么叫代码头呢??
代码头就是每一页自动翻页时,保持不变的一段代码。
打个比方,
爬取网页某一页的第一页是 https://www.baidu.com/0-0-1.html
爬取网页某一页的第二页是 https://www.baidu.com/0-0-2.html
那么 https://www.baidu.com 就是代码头
start_urls = ['http://movie.douban.com/top250']
下面进入方法的编写
(首先我们要先学会检查元素)
先找到items这个文件,我们需要先对于抓取目标做个定义。在本例中,我们抓取这6个元素。
然后我们开始找到douban_spider.py ,写
movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
创建movie_list,潜入一个根目录??意思就是在面对html的时候我们检查的文本元素基本都出现在div/ol/li以后,仔细观察下面被折叠的 < li >…< / li >,就是一页中25个项目的详细信息。
接下来这一步就不详细说了,就是在i_item里面改代码
分别找到每个元素的定位
for i_item in movie_list:douban_item = DoubanItem()douban_item['serial_number'] = i_item.xpath(".//div[@class='item']/div[@class='pic']/em/text()").extract_first()douban_item['movie_name'] = i_item.xpath(".//div[@class='info']/div[@class='hd']/a/span[1]/text()").extract_first()content = i_item.xpath(".//div[@class='info']/div[@class='bd']/p[1]/text()").extract()for i_content in content:content_s = "".join(i_content.split())douban_item['introduce'] = content_sdouban_item['star'] = i_item.xpath(".//span[@class='rating_num']/text()").extract_first()douban_item['evaluate'] = i_item.xpath(".//div[@class='star']//span[4]/text()").extract_first()douban_item['describe'] = i_item.xpath(".//p[@class='quote']/span/text()").extract_first()yield douban_item #抛回处理
记住,最重要的是:
- xpath后面的 “.” 别忘了,这个点的作用就是基于前面movie_list的地址作为根目录,作为根目录向下访问。
- yield douban_item不能漏掉,一定要抛回
- 对于introduce 这一项,因为内容都是分行显示的,所以我们也要用一个循环来完成正常的抓取。
- 对于xpath的使用可以看看我上面说的或者上网查一下xpath语法。
最后,自动翻页。
感叹一句,豆瓣真的太友好了!下一页按钮存在,那么每次就执行下一页元素指向的网址就好了。
next_link = response.xpath("//span[@class='next']/link/@href").extract()
if next_link:next_link = next_link[0]yield scrapy.Request("http://product.asmag.com.cn"+next_link,callback=self.parse)
if后面的意思就是,如果还有下一页获取到的网址就一直进行下去啦!
但是在我做的项目中并没有下一页。。我是这样处理的
next_link = response.xpath("//div[@class='listpage']/a[@class='on']/following-sibling::a/@href").extract()
思想就是通过找到这个a[@class=‘on’]的元素,这代表当前在的页面,然后我们查找他的 /following-sibling::a/
也就是下一个兄弟元素,再获取/@href就好。
除此之外,我还试过BeautifulSoup的方法还有cssselect的get方法,但是对于这类抓取来说不太有必要。
3.保存文件
激动人心的时刻。回到cmd。
scrapy crawl douban_spider -o test.csv
保存为csv格式,进到douban文件夹就能看到了
但是通过excel我们会发现它乱码!awsl
没事 win可以通过记事本打开另存为修改编码
mac用户参照这个链接:https://www.jianshu.com/p/0a3f587f630e
嗯,完美解决。
基于scrapy框架的爬虫详细步骤(含没有“下一页”按钮的href抓取)相关推荐
- python爬虫精进第5关前5页歌词爬-Python抓取歌词自制FreeStyle
故事的起因是上周六看<中国好声音>,一个周杰伦战队的学员用人工智能写的歌词,于是乎,我也有了这个想法,代码的主题思路是看Crossin先生的文章,虽然最后不能写出一首歌,但是押韵脚这事情分 ...
- wallhaven 基于scrapy框架的爬虫
没啥好说的,就一爬虫,想用就老老实实的下载scrapy这个第三方库 爬的是wallhaven网站上的壁纸,经本人验证,壁纸质量挠挠的,以下爬虫爬的是他的top排行榜上的壁纸,建议隔段时间没啥壁纸了就可 ...
- 基于Scrapy框架的Python新闻爬虫
概述 该项目是基于Scrapy框架的Python新闻爬虫,能够爬取网易,搜狐,凤凰和澎湃网站上的新闻,将标题,内容,评论,时间等内容整理并保存到本地 详细 代码下载:http://www.demoda ...
- python新闻爬虫系统的功能_基于Scrapy框架的Python新闻爬虫
一.开发背景 Python作为数据处理方面的一把好手,近年来的热度不断增长.网络爬虫可以说是Python最具代表性的应用之一,那么通过网络爬虫来学习Python以及网络和数据处理的相关内容可以说是再合 ...
- Python爬虫实战之二 - 基于Scrapy框架抓取Boss直聘的招聘信息
Python爬虫实战之三 - 基于Scrapy框架抓取Boss直聘的招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于 ...
- scrapy获取a标签的连接_python爬虫——基于scrapy框架爬取网易新闻内容
python爬虫--基于scrapy框架爬取网易新闻内容 1.需求[前期准备] 2.分析及代码实现(1)获取五大板块详情页url(2)解析每个板块(3)解析每个模块里的标题中详情页信息 点击此处,获取 ...
- 19. python爬虫——基于scrapy框架爬取网易新闻内容
python爬虫--基于scrapy框架爬取网易新闻内容 1.需求 [前期准备] 2.分析及代码实现 (1)获取五大板块详情页url (2)解析每个板块 (3)解析每个模块里的标题中详情页信息 1.需 ...
- 14. python爬虫——基于scrapy框架爬取糗事百科上的段子内容
python爬虫--基于scrapy框架爬取糗事百科上的段子内容 1.需求 2.分析及实现 3.实现效果 4.进行持久化存储 (1)基于终端指令 (2)基于管道 [前置知识]python爬虫--scr ...
- python 系列 03 - 基于scrapy框架的简单爬虫
文章目录 1. scrapy介绍 2 新建爬虫项目 3 新建蜘蛛文件 4 运行爬虫 5 爬取内容 5.1分析网页结构 5.2 关于Xpath解析 5.3 接着解析电影数据 5.4 下载缩略图 5.5 ...
最新文章
- 使用TensorFlow跟踪千年猎鹰
- Lucene系列-facet--转
- TeamTNT通过模仿WatchDog团伙来掩盖其加密劫持足迹
- html css web笔记,Web/HTML/CSS/的笔记
- excel单元格下拉菜单
- 明晚直播 | 做持有专利的程序员很难吗?专家教你如何申请!
- 零基础学Python-爬虫-5、下载音频
- CListCtrl::InsertColumn()和InsertItem()和SetItemText()
- 华科10年计算机考研复试笔试(算法基础)(1)
- 手机号正则表达式验证_想精通正则表达式 这几个正则表达式学习资料及工具你必须有!...
- ascii码01100001_【多选题】计算机中字符a的ASCII码值是(01100001)2,那么字符c的ASCII码值是( )。...
- Unity中Scene场景的视角设置成Game视图中的相机视角
- 当VR踏入足球赛事会是如何?用数学运算又是如何?
- 浙大吴飞“舌战”阿里贾扬清:AI内卷与年薪百万,哪个才是真实?
- buu-[ACTF新生赛2020]Universe_final_answer
- 国内高校硕博补贴大公开!(某校博士在读已经年薪25w了)
- 基于Kafka-Zookeeper-Nginx-FIlebeat-MySQL的日志清洗分析平台搭建
- 安霸flash dma操作
- STM32 无刷电机BLDC 1KW带刹开发板 PDF原理图 源代码 MDK源码
- ubuntu shell命令大全