最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

PythonScrapy爬虫:同步和异步分页的DEMO

来源:动视网 责编:小采 时间:2020-11-27 14:17:15
文档

PythonScrapy爬虫:同步和异步分页的DEMO

PythonScrapy爬虫:同步和异步分页的DEMO:分页交互在请求数据时有同步和异步两种情况,同步时页面整体刷新,异步时页面局部刷新。对于这两种分页的数据在进行爬虫时,处理的方式是不一样的。 DEMO仅供学习,域名全部匿为test同步分页同步分页时,页面整体刷新,url地址栏会发生变化爬虫解析的数据对象
推荐度:
导读PythonScrapy爬虫:同步和异步分页的DEMO:分页交互在请求数据时有同步和异步两种情况,同步时页面整体刷新,异步时页面局部刷新。对于这两种分页的数据在进行爬虫时,处理的方式是不一样的。 DEMO仅供学习,域名全部匿为test同步分页同步分页时,页面整体刷新,url地址栏会发生变化爬虫解析的数据对象
 分页交互在请求数据时有同步和异步两种情况,同步时页面整体刷新,异步时页面局部刷新。对于这两种分页的数据在进行爬虫时,处理的方式是不一样的。 DEMO仅供学习,域名全部匿为test

同步分页

同步分页时,页面整体刷新,url地址栏会发生变化

爬虫解析的数据对象是html

测试场景:抓取某招聘网站北京区的Java职位

#coding=utf-8import scrapyclass TestSpider(scrapy.Spider):
 name='test'
 download_delay=3
 user_agent='Mozilla/5.0 (Windows NT 6.1; WOW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
 page_url = 'http://www.test.com/zhaopin/Java/{0}/?filterOption=2'
 page=1

 #执行入口
 def start_requests(self):
 #第一页
 yield scrapy.Request(self.page_url.format('1'),
 headers={'User-Agent':self.user_agent},
 callback=self.parse,
 errback=self.errback_httpbin) #解析返回的数据
 def parse(self,response):
 for li in response.xpath('//*[@id="s_position_list"]/ul/li'): yield{ 'company':li.xpath('@data-company').extract(), 'salary':li.xpath('@data-salary').extract()
 } #是否是最后一页,根据下一页的按钮css样式判断
 if response.css('a.page_no.pager_next_disabled'):
 print('---is the last page,stop!---') 
 pass
 else:
 self.page=self.page+1
 #抓取下一页
 yield scrapy.Request(self.page_url.format(str(self.page)),
 headers={'User-Agent':self.user_agent},
 callback=self.parse,
 errback=self.errback_httpbin) #异常处理
 def errback_httpbin(self,failure):
 if failure.check(HttpError):
 response = failure.value.response print 'HttpError on {0}'.format(response.url) elif failure.check(DNSLookupError):
 request = failure.request print'DNSLookupError on {0}'.format(request.url) elif failure.check(TimeoutError, TCPTimedOutError):
 request = failure.request print'TimeoutError on {0}'.format(request.url)

启动爬虫:scrapy runspider //spiders//test_spider.py -o test.csv 完毕后生成csv格式的文件:

异步分页

异步分页时,页面局部刷新,url地址栏不发生变化

爬虫解析的数据对象通常是Json

测试场景:抓取某电影网站的经典电影前100

#coding=utf-8import scrapyimport jsonclass TestSpider(scrapy.Spider):
 name ='test'
 download_delay = 3
 user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
 pre_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%BB%8F%E5%85%B8&sort=recommend&page_limit=20&page_start='
 page=0
 cnt=0
 def start_requests(self):
 url= self.pre_url+str(0*20) yield scrapy.Request(url,headers={'User-Agent':self.user_agent},callback=self.parse) def parse(self,response):
 if response.body: # json字符串转换成Python对象
 python_obj=json.loads(response.body)
 subjects=python_obj['subjects'] if len(subjects)>0: for sub in subjects:
 self.cnt=self.cnt+1
 yield { 'title':sub["title"], 'rate':sub["rate"]
 } if self.cnt<100: print 'next page-------'
 self.page=self.page+1
 url= self.pre_url+str(self.page*20) yield scrapy.Request(url,headers={'User-Agent':self.user_agent},callback=self.parse)

启动爬虫:scrapy runspider //spiders//test_spider.py -o test.json 完毕后生成json格式的文件:

Scrapy与BeautifulSoup or lxml的区别

scrapy是编写爬虫和抓取数据的一整套框架,而BeautifulSoup or lxml只是解析html/xml的库,功能就像scrapy的xpath和css选择器,所以它们也可以在scrapy下使用,只是运行效率相对较低。 在使用scrapy的选择器时,我们可以借助浏览器的F12模式,直接Copy任意节点的xpath和css值。

文档

PythonScrapy爬虫:同步和异步分页的DEMO

PythonScrapy爬虫:同步和异步分页的DEMO:分页交互在请求数据时有同步和异步两种情况,同步时页面整体刷新,异步时页面局部刷新。对于这两种分页的数据在进行爬虫时,处理的方式是不一样的。 DEMO仅供学习,域名全部匿为test同步分页同步分页时,页面整体刷新,url地址栏会发生变化爬虫解析的数据对象
推荐度:
标签: 分页 python 爬虫
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top