Scrapy 知识总结
1、安装
1 pip install wheel 2 pip install https://download.lfd.uci.edu/pythonlibs/q5gtlas7/Twisted-19.2.0-cp37-cp37m-win_amd64.whl 3 pip install scrapy 4 5 ps: 因为twisted是whl包,所以需要先安装whl包对应的工具 wheel;第二步安装 Twisted方法,在https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 页面找到对应自己操作系统位数和python版本的whl文件
2、创建 Scrapy 项目
scrapy startproject douban
创建好的项目目录如下
3、在 douban - douban - spiders 目录中创建爬虫文件 top250.py
1 import scrapy 2 import bs4 3 from ..items import DoubanItem 4 5 class DoubanSpider(scrapy.Spider): 6 name = 'douban' 7 allowed_domains = ['https://book.douban.com'] 8 start_urls = [] 9 for x in range(3): 10 url = 'https://book.douban.com/top250?start=' + str(x * 25) 11 start_urls.append(url) 12 13 def parse(self,response): 14 bs = bs4.BeautifulSoup(response.text,'html.parser') 15 datas = bs.find_all('tr',class_='item') 16 for data in datas: 17 item = DoubanItem() 18 item['title'] = data.find_all('a')[1]['title'] 19 item['publish'] = data.find('p',class_='pl').text 20 item['score'] = data.find('span',class_='rating_nums').text 21 #print(item['title']) 22 yield item
4、编辑 douban - douban - items.py
1 import scrapy 2 3 class DoubanItem(scrapy.Item): 4 title = scrapy.Field() 5 publish = scrapy.Field() 6 score = scrapy.Field()
5、编辑 douban - douban - settings.py
1 BOT_NAME = 'douban' 2 SPIDER_MODULES = ['douban.spiders'] 3 NEWSPIDER_MODULE = 'douban.spiders' 4 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' 5 ROBOTSTXT_OBEY = False
6、在 douban 目录下执行
scrapy crawl douban ,或者在豆瓣目录下创建main.py,然后执行 main.py
1 from scrapy import cmdline 2 #导入cmdline模块,可以实现控制终端命令行。 3 cmdline.execute(['scrapy','crawl','douban']) 4 #用execute()方法,输入运行scrapy的命令。
Scrapy 保存结果到csv , 只需在 settings.py 文件中添加下面三行
1 FEED_URI='./storage/data/%(name)s.csv' 2 FEED_FORMAT='CSV' 3 FEED_EXPORT_ENCODING='utf-8-sig'
保存到与 settings.py 同目录下的storage目录下的data目录下,文件名是该项目名字.csv
Scrapy 保存结果到excel, 只需在 settings.py 文件中添加下面三行
1 ITEM_PIPELINES = { 2 'jobuitest.pipelines.JobuitestPipeline': 300, 3 }
然后编辑 pipelines.py
1 import openpyxl 2 3 class JobuiPipeline(object): 4 #定义一个JobuiPipeline类,负责处理item 5 def __init__(self): 6 #初始化函数 当类实例化时这个方法会自启动 7 self.wb =openpyxl.Workbook() 8 #创建工作薄 9 self.ws = self.wb.active 10 #定位活动表 11 self.ws.append(['公司', '职位', '地址', '招聘信息']) 12 #用append函数往表格添加表头 13 14 def process_item(self, item, spider): 15 #process_item是默认的处理item的方法,就像parse是默认处理response的方法 16 line = [item['company'], item['position'], item['address'], item['detail']] 17 #把公司名称、职位名称、工作地点和招聘要求都写成列表的形式,赋值给line 18 self.ws.append(line) 19 #用append函数把公司名称、职位名称、工作地点和招聘要求的数据都添加进表格 20 return item 21 #将item丢回给引擎,如果后面还有这个item需要经过的itempipeline,引擎会自己调度 22 23 def close_spider(self, spider): 24 #close_spider是当爬虫结束运行时,这个方法就会执行 25 self.wb.save('./jobui.xlsx') 26 #保存文件 27 self.wb.close() 28 #关闭文件
Scrapy 设置 下载延时 编辑settings.py 文件 ,默认没有延时,单位秒
1 DOWNLOAD_DELAY = 3
Scrapy 未解之谜
1、自带解析器怎么用
2、如何带参数请求数据
3、如何写入cookies
4、如何发送邮件
5、如何与 selenium联动
6、如何完成超厉害的分布式爬虫
Scrapy 核心代码,callback
1 #导入模块: 2 import scrapy 3 import bs4 4 from ..items import JobuiItem 5 6 7 class JobuiSpider(scrapy.Spider): 8 name = 'jobs' 9 allowed_domains = ['www.jobui.com'] 10 start_urls = ['https://www.jobui.com/rank/company/'] 11 12 #提取公司id标识和构造公司招聘信息的网址: 13 def parse(self, response): 14 #parse是默认处理response的方法 15 bs = bs4.BeautifulSoup(response.text, 'html.parser') 16 ul_list = bs.find_all('ul',class_="textList flsty cfix") 17 for ul in ul_list: 18 a_list = ul.find_all('a') 19 for a in a_list: 20 company_id = a['href'] 21 url = 'https://www.jobui.com{id}jobs' 22 real_url = url.format(id=company_id) 23 yield scrapy.Request(real_url, callback=self.parse_job) 24 #用yield语句把构造好的request对象传递给引擎。用scrapy.Request构造request对象。callback参数设置调用parsejob方法。 25 26 27 def parse_job(self, response): 28 #定义新的处理response的方法parse_job(方法的名字可以自己起) 29 bs = bs4.BeautifulSoup(response.text, 'html.parser') 30 #用BeautifulSoup解析response(公司招聘信息的网页源代码) 31 company = bs.find(id="companyH1").text 32 #用fin方法提取出公司名称 33 datas = bs.find_all('li',class_="company-job-list") 34 #用find_all提取<li class_="company-job-list">标签,里面含有招聘信息的数据 35 for data in datas: 36 #遍历datas 37 item = JobuiItem() 38 #实例化JobuiItem这个类 39 item['company'] = company 40 #把公司名称放回JobuiItem类的company属性里 41 item['position']=data.find('h3').find('a').text 42 #提取出职位名称,并把这个数据放回JobuiItem类的position属性里 43 item['address'] = data.find('span',class_="col80").text 44 #提取出工作地点,并把这个数据放回JobuiItem类的address属性里 45 item['detail'] = data.find('span',class_="col150").text 46 #提取出招聘要求,并把这个数据放回JobuiItem类的detail属性里 47 yield item 48 #用yield语句把item传递给引擎