python【系列教程】之网络爬虫

举报
小米粒-biubiubiu 发表于 2020/11/29 00:31:16 2020/11/29
【摘要】 一、Scrapy简介 爬虫的应用方面: 通过网络技术向指定的url发送请求,获取服务器响应内容使用某种技术(如正则表达式,XPath等)提取页面中我们感兴趣的信息高效的识别响应页面中的链接信息,顺着这些链接递归 安装scrapy pip install scrapy 本人在安装的时候并没有报以上错误 成功安装scrapy之后,可以通过doc来查看scrapy...

一、Scrapy简介

爬虫的应用方面:

  1. 通过网络技术向指定的url发送请求,获取服务器响应内容
  2. 使用某种技术(如正则表达式,XPath等)提取页面中我们感兴趣的信息
  3. 高效的识别响应页面中的链接信息,顺着这些链接递归

安装scrapy

pip install scrapy

本人在安装的时候并没有报以上错误

成功安装scrapy之后,可以通过doc来查看scrapy的文档 。

python -m pydoc -p 8899

打开浏览器查看localhost:8899的页面,可以在python安装目录的lib\site-packages下看到scrapy的文档

 

二、使用爬虫爬取、分析招聘信息

创建scrapy 项目

scrapy startproject ZhipinSpider

 

 

 下面我们来爬去boss直聘 广州地区的招聘信息https://www.zhipin.com/c101280100/h_101280100

使用scrapy提供的shell调试工具来抓取该页面中的信息,使用如下命令来开启shell调试

 scrapy shell https://www.zhipin.com/c101280100/h_101280100

运行上面命令,将会看到如果所示的提示信息

 

scrapy shell -s USER_AGENT='Mozilla/5.0' https://www.zhipin.com/c101280100/h_101280100

 

response.xpath('//div[@class="job-primary"]/div/h3/a/div/text()').extract()

 

 response.css('div.job-primary>div.info-primary>h3.name span').extract()

 

  (1)编写items.py文件


  
  1. # -*- coding: utf-8 -*-
  2. # Define here the models for your scraped items
  3. #
  4. # See documentation in:
  5. # https://docs.scrapy.org/en/latest/topics/items.html
  6. import scrapy
  7. class ZhipinspiderItem(scrapy.Item):
  8. # define the fields for your item here like:
  9. # name = scrapy.Field()
  10. #工作名称
  11. title = scrapy.Field()
  12. #工资
  13. salary = scrapy.Field()
  14. #招聘公司
  15. conpany = scrapy.Field()
  16. #工作详细链接
  17. url = scrapy.Field()
  18. #工作地点
  19. work_addr = scrapy.Field()
  20. #行业
  21. industry = scrapy.Field()
  22. #公司规模
  23. company_size = scrapy.Field()
  24. #招聘人
  25. recruiter = scrapy.Field()
  26. #发布时间
  27. publish_date = scrapy.Field()
  28. pass

(2)

 scrapy genspider job_position "zhipin.com"

 


  
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. class JobPositionSpider(scrapy.Spider):
  4. #定义该spider的名字
  5. name = 'job_position'
  6. #定义该spider允许爬取的域名
  7. allowed_domains = ['zhipin.com']
  8. #定义该spider爬取的首页列表
  9. start_urls = ['http://zhipin.com/']
  10. #该方法负责提取response所包含的信息
  11. def parse(self, response):
  12. pass

 

 

 


  
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. from ZhipinSpider.items import ZhipinspiderItem
  4. class JobPositionSpider(scrapy.Spider):
  5. # 定义该spider的名字
  6. name = 'job_position'
  7. # 定义该spider允许爬取的域名
  8. allowed_domains = ['zhipin.com']
  9. # 定义该spider爬取的首页列表
  10. start_urls = ['https://www.zhipin.com/c101280100/h_101280100/']
  11. # 该方法负责提取response所包含的信息
  12. # response代表下载器从start_urls中的每个url下载得到的响应
  13. def parse(self, response):
  14. # 遍历页面中的所有的//div[@class="job-primary"]节点
  15. for job_primary in response.xpath('//div[@class="job_primary"]'):
  16. item = ZhipinspiderItem()
  17. # 匹配//div[@class="job-primary"]节点下的/div[@class="info-primary"]节点
  18. # 也就是匹配到包含工作信息的<div.../>元素
  19. info_primary = job_primary.xpath('./div[@class="info-primary"]')
  20. item['title'] = info_primary.xpath('./h3/a/div[@class="job-title"]/text()').extract_first()
  21. item['salary'] = info_primary.xpath('./h3/a/span[@class="red"]/text()').extract_first()
  22. item['work_addr'] = info_primary.xpath('./p/text()').extract_first()
  23. item['url'] = info_primary.xpath('./h3/a/@href').extract_first()
  24. # 匹配公司信息<div.../>
  25. company_text = job_primary.xpath('./div[@class="info-company"]/div[@class="company-text"]')
  26. item['company'] = company_text.xpath('./h3/a/text()').extract_first()
  27. company_info = company_text.xpath('./p/text()').extract()
  28. if company_info and len(company_info) > 0:
  29. item['industry'] = company_text.xpath('./p/text()').extract()[0]
  30. if company_info and len(company_info) > 1:
  31. item['company_size'] = company_text.xpath('./p/text()').extract()[2]
  32. # 匹配发布人信息
  33. info_publis = job_primary.xpath('./div[@class="info-publis"]')
  34. item['recruiter'] = info_publis.xpath('./h3/text()').extract_first()
  35. item['publish_date'] = info_publis.xpath('./p/text()').extract_first()
  36. yield item

 

(3)编写piplines.py文件,该文件负责将所爬取的数据写入文件或者数据库中


  
  1. # -*- coding: utf-8 -*-
  2. # Define your item pipelines here
  3. #
  4. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  5. # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
  6. class ZhipinspiderPipeline(object):
  7. def process_item(self, item, spider):
  8. print('工作:',item['title'])
  9. print('工资:',item['salary'])
  10. print('招聘公司:',item['conpany'])
  11. print('工作详细链接:',item['url'])
  12. print('工作地点:',item['work_addr'])
  13. print('行业:',item['industry'])
  14. print('公司规模:',item['company_size'])
  15. print('招聘人:',item['recruiter'])
  16. print('发布时间:',item['publish_date'])
  17. return item

 配置settings.py文件


  
  1. # -*- coding: utf-8 -*-
  2. # Scrapy settings for ZhipinSpider project
  3. #
  4. # For simplicity, this file contains only settings considered important or
  5. # commonly used. You can find more settings consulting the documentation:
  6. #
  7. # https://docs.scrapy.org/en/latest/topics/settings.html
  8. # https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
  9. # https://docs.scrapy.org/en/latest/topics/spider-middleware.html
  10. BOT_NAME = 'ZhipinSpider'
  11. SPIDER_MODULES = ['ZhipinSpider.spiders']
  12. NEWSPIDER_MODULE = 'ZhipinSpider.spiders'
  13. # Obey robots.txt rules
  14. ROBOTSTXT_OBEY = True
  15. # Override the default request headers:
  16. DEFAULT_REQUEST_HEADERS = {
  17. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
  18. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  19. 'Accept-Language': 'en',
  20. }
  21. # Configure item pipelines
  22. # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
  23. ITEM_PIPELINES = {
  24. 'ZhipinSpider.pipelines.ZhipinspiderPipeline': 300,
  25. }

回顾一下上面的开发过程,使用scrapy开发爬虫的核心工作就是三步。

  1. 定义Item类,由于Item只是一个DTO对象,因此定义Item类很简单
  2. 开发Spider类。这一步是核心,Spider使用XPath从页面中提取项目所需的信息,并用这些信息来封装Item对象
  3. 开发Pipeline。Pipline负责处理Spider获取的Item对象

经过上面的步骤,这个基于Scrapy的spider已经开发完成,在命令行窗口中进入ZhipinSpider项目目录下,执行如下命令启动Spider。

scrapy crawl job_position

这里的job_position就是前面定义 的Spider名称


  
  1. #继续请求下一页的数据
  2. new_links = response.xpath('//div[@class="page"]/a[@class="next"]/@href').extract()
  3. if new_links and len(new_links) > 0:
  4. # 获取下一页的链接
  5. new_link = new_links[0]
  6. yield scrapy.Request("https://www.zhipin.com" + new_link, callback=self.parse)

 

 

 

 

 

三、处理反爬虫

scrapy shell https://unsplash.com/

 

 

 

 创建项目

 scrapy startproject UnsplashImageSpider

 

 

 

 

 

 

 

 (2)常用的反爬虫手段

1.IP地址验证

 2.禁用cookie

 3.违反爬虫规则文件

4.限制访问频率

 

 5.图形验证码

(3)整合Selenium模拟浏览器行为

 1.为python安装 selenium 库

pip  install selenium

 2.下载浏览器驱动

 

3.安装目标浏览器

 

 

 

 

 

 

 一句话,只要技术到位,网络上没有爬取不到的数据,当然,如果有些网站的数据属于机密数据,并且这些网站也已经采取种种措施来防止非法访问,但是你非要越过层层限制去访问这些数据,这就涉嫌触犯法律了,因此,爬虫也要适可而止。

 

文章来源: blog.csdn.net,作者:血煞风雨城2018,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_31905135/article/details/102504337

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。