动态获取网页数据,今天感觉到经历了无与伦比的绝望来一次记录一下自己的心情,并且写了源码希望大家跳过这个坑
这是middlewares.py文件里的代码来请求动态数据并返回给spider文件
class SeleniumSpiderMiddlewares(object):
#在middlewares.py文件里面插入请求自定义的
def __init__(self):
self.driver=webdriver.PhantomJS()
def process_request(self,request,spider):
# 当引擎从调度器中取出request进行请求发送下载器之前
# 会先执行当前的爬虫中间件 ,在中间件里面使用selenium
# 请求这个request ,拿到动态网站的数据 然后将请求
# 返回给spider爬虫对象
if spider.name=='tao':
# 使用爬虫文件的url地址
spider.driver.get(request.url)
for x in range(1,24,2):
i=float(x)/24
# scrollTop 从上往下的滑动距离
js='document.body.scrollTop=document.body.srcollHeight *% f'% i
spider.driver.execute_script(js)
# 设置响应信息
# 响应的url为请求的url
# 响应的网页内容为请求网页的源码
# 响应的编码为utf-8
# 请求的信息为获取的请求信息
response=HtmlResponse(url=request.url,
body=spider.driver.page_source,
encoding='utf-8',
request=request)
# 这个地方只能返回response对象
# 如果返回了response对象
# 那么可以直接跳过下载中间件
# 将response的值传递给引擎
# 引擎又传递给 spider进行解析
return response
在爬虫中的文件获取数据
import scrapy
from ..items import TaobaoItem
from selenium import webdriver
class TaoSpider(scrapy.Spider):
name = 'tao'
allowed_domains = ['p4psearch.1688.com']
start_urls = ['https://p4psearch.1688.com/p4p114/p4psearch/offer2.htm?keywords=%E8%8A%B1%E5%8D%89&cosite=baidujj&location=landing_t4&trackid=885688128720911847937377&sortType=&descendOrder=&province=&city=&priceStart=&priceEnd=&dis=&provinceValue=%E6%89%80%E5%9C%A8%E5%9C%B0%E5%8C%BA']
def __init__(self):
self.driver=webdriver.PhantomJS()
def parse(self, response):
item=TaobaoItem()
# print(response.text)
con_list=response.xpath('//div[@class="offer_item"]')
for div in con_list:
title=div.xpath('.//div[@class="tips2"]/text()').extract()
print(title)
price=div.xpath('.//span[@class="price"]/text()').extract_first()
print(price)
item['title']=title
item['price']=price
yield item
这是items.py文件
title=scrapy.Field()
price=scrapy.Field()
最后来写一下把数据如何存入到excel表格中,将一个Excel表格 ,命名为table.xlst
pipeline.py文件里面的代码
import xlwt
class TaobaoPipeline(object):
def __init__(self):
self.workbook=xlwt.Workbook(encoding='utf-8')
self.sheet=self.workbook.add_sheet('花卉')
self.info_list=['title','price']
self.row=1
def open_spider(self,spider):
for index ,info in enumerate(self.info_list):
self.sheet.write(0,index,info)
def close_spider(self,spider):
self.workbook.save('table.xlsx')
def process_item(self, item, spider):
data_list=(item['title'],item['price'])
for index,info in enumerate(data_list):
self.sheet.write(self.row,index,info)
self.row+=1
return item
最后要记住setting.py文件决定你的数据的是否出来就是来开启管道和其他设置最后给你们截图
一定要关闭
扫描二维码关注公众号,回复:
2970783 查看本文章