文章目录

  • 需求:
  • 总结:
  • 代码:
    • movieinfo.py
    • items.py
    • middleware.py
    • pipelines.py
  • 结果:
  • 附加:
  • crawlspider可以改进:

需求:

  • scrapy框架,爬取某电影网页面的每个电影的一级页面的名字
  • https://www.55xia.com/
  • 爬取每部电影二级页面的详细信息
  • 使用代理ip
  • 保存日志文件
  • 存为csv文件

总结:

1、xpath解析使用extract()的各种情况分析
https://blog.csdn.net/nzjdsds/article/details/77278400

2、xpath用法注意的点:

div[not(contains(@class,"col-xs-12"))]

class属性不包括"col-xs-12"的div标签
https://blog.csdn.net/caorya/article/details/81839928?utm_source=blogxgwz1

3、二次解析时,用meta参数字典格式传递第一次解析的参数值。

 # meta 传递第二次解析函数yield scrapy.Request(url=url, callback=self.parse_detail, meta={'item': item})

4、存为csv文件:

import csv
csv.writer
writerow

https://blog.csdn.net/qq_40243365/article/details/83003161

5、空行加参数newline='',

self.f=open('./movie.csv','w',newline='', encoding='utf-8')

6、伪装UA,保存日志,编码格式
settings里设置

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36'
FEED_EXPORT_ENCODING = 'utf-8-sig'
LOG_LEVEL = 'ERROR'
LOG_FILE = 'log.txt'
ROBOTSTXT_OBEY = False

7、代理ip中间件

class MyMiddleware(object):def process_request(self, request, spider):request.meta['proxy'] = 'https://157.230.150.101:8080'

settings设置:

DOWNLOADER_MIDDLEWARES = {'movie.middlewares.MyMiddleware': 543,
}

代码:

movieinfo.py

import scrapy
from movie.items import MovieItemclass MovieinfoSpider(scrapy.Spider):name = 'movieinfo'# allowed_domains = ['www.movie.com']start_urls = ['https://www.55xia.com/movie']page = 1base_url = 'https://www.55xia.com/movie/?page={}'# 解析二级子页面def parse_detail(self, response):# 导演可能不止一人,不用extract_first(),拼接成字符串directors = response.xpath('/html/body/div[1]/div/div/div[1]/div[1]/div[2]/table/tbody/tr[1]/td[2]//a/text()').extract()directors = " ".join(directors)movieType = response.xpath('/html/body/div[1]/div/div/div[1]/div[1]/div[2]/table/tbody/tr[4]/td[2]/a/text()').extract_first()area = response.xpath('/html/body/div[1]/div/div/div[1]/div[1]/div[2]/table/tbody/tr[5]/td[2]//text()').extract_first()time = response.xpath('/html/body/div[1]/div/div/div[1]/div[1]/div[2]/table/tbody/tr[7]/td[2]//text()').extract_first()score = response.xpath('/html/body/div[1]/div/div/div[1]/div[1]/div[2]/table/tbody/tr[9]/td[2]//a/text()').extract_first()# 取出meta的itemitem = response.meta['item']print('二级子页面:', item['name'])item['directors'] = directorsitem['movieType'] = movieTypeitem['area'] = areaitem['time'] = timeitem['score'] = scoreyield itemdef parse(self, response):"""获取超链接导演,编剧,主演,类型,地区,语言,上映时间,别名,评分:param response::return:"""div_list = response.xpath('/html/body/div[1]/div[1]/div[2]/div[not(contains(@class,"col-xs-12"))]')for div in div_list:name = div.xpath('./div/div/h1/a/text()').extract_first()print('已找到:',name)url = div.xpath('.//div[@class="meta"]/h1/a/@href').extract_first()url = "https:" + url# 实例化item对象并存储item = MovieItem()item['name'] = name# meta 传递第二次解析函数yield scrapy.Request(url=url, callback=self.parse_detail, meta={'item': item})# 完成每页之后开始下一页if self.page < 3:self.page += 1new_url=self.base_url.format(self.page)yield scrapy.Request(url=new_url, callback=self.parse)

items.py

import scrapyclass MovieItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()name = scrapy.Field()directors = scrapy.Field()movieType = scrapy.Field()area = scrapy.Field()time = scrapy.Field()score = scrapy.Field()

middleware.py


class MyMiddleware(object):def process_request(self, request, spider):request.meta['proxy'] = 'https://157.230.150.101:8080'

pipelines.py

import csvclass MoviePipeline(object):def open_spider(self, spider):print('开始存储')self.f=open('./movie.csv','w',newline='', encoding='utf-8')self.writer= csv.writer(self.f)self.writer.writerow(['name','directors','movieType','area','time','score'])def process_item(self, item, spider):print('正在写入')self.writer.writerow([item['name'],item['directors'],item['movieType'],item['area'],item['time'],item['score']])return itemdef close_spider(self, spider):self.f.close()print('保存完成')

结果:

附加:

Excel和CSV格式文件的不同之处
https://blog.csdn.net/weixin_39198406/article/details/78705016

crawlspider可以改进:

crawlspider更加高效,直接写个正则,可以提取页面符合规则的所有url,直接解析。

  • 创建工程scrapy startproject 工程名
  • cd 该文件夹
  • 创建爬虫文件 scrapy genspider -t crawl 爬虫文件名 网址
  • 主要是rule比较牛

  rules = (Rule(LinkExtractor(allow=r'/movie/\?page=\d+'), callback='parse_item', follow=False),)
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Ruleclass TtSpider(CrawlSpider):name = 'tt'# allowed_domains = ['www.baidu.com']start_urls = ['https://www.55xia.com/movie']rules = (Rule(LinkExtractor(allow=r'/movie/\?page=\d+'), callback='parse_item', follow=False),)'''LinkExtractor(allow=r'Items/') 实例化一个链接提取器的对象,根据allow的正则表达式来提取指定内容。Rule()实例化一个规则解析器对象,对Link提取的链接发起请求,获取链接对应的页面内容,交给callback解析follow 表示是否在提取到的url链接页面再次以相同规则提取,scrapy 最后会去重# follow=True 所有的页面数据。'''def parse_item(self, response):# i = {}#i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()#i['name'] = response.xpath('//div[@id="name"]').extract()#i['description'] = response.xpath('//div[@id="description"]').extract()# return i'''print(response)打印的是提取器提取到的链接,但是可以直接response.xpath解析链接指向的页面!:param response::return:'''title=response.xpath('/html/body/div[1]/div[1]/div[2]/div[1]/div/div/h1/a/text()').extract_first()print(title)


爬虫——scrapy框架爬取多个页面电影的二级子页面的详细信息相关推荐

  1. Python爬虫 scrapy框架爬取某招聘网存入mongodb解析

    这篇文章主要介绍了Python爬虫 scrapy框架爬取某招聘网存入mongodb解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建项目 sc ...

  2. python爬虫scrapy框架爬取网页数据_Scrapy-Python

    scrapy Scrapy:Python的爬虫框架 实例Demo 抓取:汽车之家.瓜子.链家 等数据信息 版本+环境库 Python2.7 + Scrapy1.12 初窥Scrapy Scrapy是一 ...

  3. 爬虫scrapy框架 爬取一药网

    cmd 命令创建项目 scrapy startproject yiyaowang cd yiyaowang scrapy genspider yaowang yaowang.com 先进入settin ...

  4. python爬虫scrapy框架爬取糗妹妹段子首页

    声明:本文仅为学习爬虫,请勿商业和恶意攻击网站,本文所有解释权归作者. 本文分别用两种方法把获取的段子信息存储到了本地,分别是txt文件和json文件, txt文件比较简单,生成字典后用命令直接执行即 ...

  5. python爬虫库scrapy_使用Python爬虫Scrapy框架爬取数据

    时隔数月,国庆期间想做个假期旅游的分析展示. 1.通过Python爬取旅游网站上数据,并存储到数据库 2.通过Echart/FineReport/Superset等数据分析工具对数据展示 环境: Wi ...

  6. Python爬虫 scrapy框架 爬取智联招聘,并把数据存入数据库,存为json格式的数据

    First:创建项目:执行下面三句命令: 1. scrapy startproject zhilianzhaopin2. cd zhilianzhaopin3.scrapy genspider zhi ...

  7. 爬虫 scrapy框架 爬取360图片

    创建项目三步 scrapy startproject image360 cd image360 scrapy genspider image 首先还是先把服从机器人协议改成False settings ...

  8. 03_使用scrapy框架爬取豆瓣电影TOP250

    前言: 本次项目是使用scrapy框架,爬取豆瓣电影TOP250的相关信息.其中涉及到代理IP,随机UA代理,最后将得到的数据保存到mongoDB中.本次爬取的内容实则不难.主要是熟悉scrapy相关 ...

  9. 实现Scrapy框架爬取酷狗音乐Top100名,并存储为TXT,JSON,CSV和Excel格式数据

    前言 实现Scrapy框架爬取网页数据(酷狗音乐Top100名,包括排名信息.歌手信息.歌曲名.歌曲时长) 一.创建项目 在cmd中输入: scrapy startproject kugouScrap ...

最新文章

  1. linux 推荐硬件配置,2012最受欢迎的Linux用户硬件配置
  2. LFS 8.3 中文翻译版本发布!
  3. mongodb安装.
  4. AtCoder AGC029F Construction of a Tree (二分图匹配)
  5. 在mvc4里怎样引用:System.Web.Optimization和entityframework
  6. Java生鲜电商平台-订单配送模块的架构与设计
  7. 一、服务端开发基础(搭建Web服务器、网络基础概念、请求响应流程、配置Apache、静态网站与动态网站)
  8. Firefly推出了小型高性能嵌入式主机
  9. 站在智能路由的风口,他选择把传统OA放进盒子
  10. Acitivity创建与配置
  11. debian 7 mysql_debian7.2+nginx+mysql
  12. java零碎要点001--深入理解JVM_Java的堆内存_栈内存_以及运行时数据区的作用
  13. 关于css的一切(updating...)
  14. 1.1.6版本Druid连接MSSQLServer 2008 R2报错The query timeout value -1 is not valid. #2210
  15. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
  16. 云计算机运维是什么,云计算运维管理是什么?
  17. 求虐,我还想再拓展一次
  18. 消元法解二元一次方程组c语言,消元法解二元一次方程组的概念、步骤与方法...
  19. html语言标题怎么居中,HTML – 如何在标题中垂直居中文本?
  20. java 三个点号...的含义-可变参数

热门文章

  1. CentOS_anydesk
  2. 算法开发:将合并后的模型编译成动态库(so文件)提供给qt调用
  3. 还在问视频音频转文字软件哪个好吗?快码住这两款
  4. [electron]Electron安装报错connect ETIMEDOUT
  5. 为什么要将数据序列化?
  6. 另类推柿子 Crypto Lights
  7. 喇叭的灵敏度代表什么
  8. 微信可以改彩色昵称了
  9. QAP内建包迁移教程
  10. Word里一级标题里页眉很近