当前位置:   article > 正文

使用scrapy框架爬取携程旅行数据_scrapy 携程旅行攻略

scrapy 携程旅行攻略

文章目录


scrapy 基本概念

Scrapy是由Twisted写的一个受欢迎的python事件驱动网络框架,它使用的是非阻塞的异步处理。

1.内部各组件的作用

  ScrapyEngine(scrapy引擎):是用来控制整个系统的数据处理流程,并进行事务处理的触发。

  Scheduler(调度器):用来接收引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。它就像是一个URL的优先队列,由它来决定下一个要抓取的网址是什么,同时在这里会去除重复的网址。

  Downloader(下载器):用于下载网页内容,并将网页内容返回给爬虫(Spiders)(Scrapy下载器是建立在Twisted这个高效的异步模型上的)。

  Spiders(爬虫):爬虫主要是干活的,用于从特定网页中提取自己需要的信息,即所谓的实体(Item)。也可以从中提取URL,让scrapy继续爬取下一个页面。

  Pipeline(项目管道):负责处理爬虫从网页中爬取的实体,主要的功能就是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被送到项目管道,并经过几个特定的次序处理数据。

  Downloader Middlewares(下载器中间件):位于scrapy引擎和下载器之间的框架,主要是处理scrapy引擎与下载器之间的请求及响应。设置代理ip和用户代理可以在这里设置。

  Spider Middlewares(爬虫中间件):位于scrapy引擎和爬虫之间的框架,主要工作是处理爬虫的响应输入和请求输出。

  Scheduler Middlewares(调度中间件):位于scrapy引擎和调度器之间的框架,主要是处理从scrapy引擎发送到调度器的请求和响应。

2.Scrapy运行流程

  引擎从调度器中取出一个URL用于接下来的抓取

  引擎把URL封装成一个请求(Request)传给下载器

  下载器把资源下载下来,并封装成一个响应(Response)

  爬虫解析Response

  解析出的是实体(Item),则交给项目管道(Pipeline)进行进一步的处理

  解析出的是链接(URL),则把URL交给调度器等待下一步的抓取

3.基本流程图

一、scrapy框架的基本使用

1.两种比较方便的安装scrapy框架的cmd命令

  1. pip install scrapy -i https://pypi.douban.com/simple
  2. easy install scrapy -i https://pypi.douban.com/simple

2.测试是否安装完成scrapy框架

3.创建一个scrapy工程的cmd命令

scrapy startproject 工程名

4.使用cmd命令创建scrapy模板

  1. cd 工程文件夹绝对路径
  2. scrapy genspider 模板启动名称 所要爬取的网站地址

5.cmd命令启动scrapy模板

scrapy crawl 模板启动名称

6.我们也可以在pycharm中编写__init__文件来启动scrapy模板

  1. from scrapy import cmdline
  2. cmdline.execute("scrapy crawl 模板名称".split())

7.最终完成的工程蓝图

    

二、使用步骤

1.引入库

代码如下(示例):

  1. import scrapy
  2. import json
  3. import re
  4. import time
  5. import fake_useragent
  6. import urllib.parse

2.对不同的网页地址和地区格式化为相应的url

代码如下(示例):

  1. city = ['广东', '广州', '珠海', '广州长隆旅游度假区', '珠海长隆旅游度假区', '深圳', '佛山', '顺德区', '汕头', '潮州', '南澳', '惠州', '清远', '惠东', '英德',
  2. '东莞', '巽寮湾', '福建', '广西', '澳门', '连州', '厦门', '连南', '鼓浪屿', '江门', '桂林', '海南', '韶关', '阳朔', '丹霞山', '开平', '仁化',
  3. '茂名', '湛江', '中山', '揭阳', '博罗', '阳江', '三亚', '湖南', '灵川', '虎门镇', '电白区', '潮汕地区', '保亭', '肇庆', '香港', '郴州', '资兴',
  4. '汕尾', '海口', '漳州', '梅州', '梅县区', '河源', '乳源', '龙岩', '放鸡岛', '龙脊梯田', '龙胜', '海丰', '贵州', '黄果树', '西江千户苗寨', '下川岛',
  5. '台山', '雷山', '安顺', '贵阳', '黔东南', '揭西', '江口', '长沙', '迪庆', '东源', '北海', '陆丰', '黔南', '东山', '丽江', '大理', '泉州',
  6. '雁山区', '花都区', '荔波', '湘西', '铜仁', '饶平', '玉龙', '古丈', '永顺', '涠洲岛', '泸沽湖', '张家界', '慈利', '凤凰', '香格里拉', '陵水',
  7. '从化区', '云南', '南靖', '武陵源区', '四川', '内江', '南京', '龙海', '徐闻', '柳州', '百色', '湄洲岛', '大埔', '南雄', '福安', '化州', '靖西',
  8. '漳浦', '新兴', '大新', '大理市', '南宁', '福州', '增城区', '霞浦', '吉林', '崇左', '凯里', '惠安', '云浮', '莆田', '宁德', '雷州', '资中',
  9. '通榆', '平潭', '南平', '武夷山', '龙门', '白城', '江苏']
  10. def start_requests(self):
  11. start_urls = []
  12. for city in self.city:
  13. for page in range(1,10):
  14. start_urls.append(f"https://vacations.ctrip.com/list/grouptravel/sc.html?from=do&st={urllib.parse.quote(city)}&sv={urllib.parse.quote(city)}&startcity=1&p=" + str(page))

3.设置请求头使用fake_useragent来产生随机代理 Cookie是必不可少的

代码如下(示例):

1.通过F12来获取Cookie

  1. ua = fake_useragent.UserAgent()
  2. headers1 = {
  3. "user-agent": ua.random,
  4. "cookie": '_abtest_userid=2df56b21-9339-4e4b-8c09-02b5beff8e3c; ibulanguage=CN; ibulocale=zh_cn; '
  5. 'cookiePricesDisplayed=CNY; _RGUID=4f897aab-fdf2-4245-ab79-f765499974fa; '
  6. '_RDG=2820c9cf7e093728603b0517d2507ebadd; _RSG=59ayzlgU9.4wJNc9LszvjA; '
  7. 'MKT_CKID=1611537971413.wbgkj.d7u3; _ga=GA1.2.1766539034.1611537972; '
  8. 'GUID=09031075311236150207; login_uid=E30107C55EDC99FA37DCD11431CAA329; login_type=0; '
  9. 'cticket=8BDB1CD16B879605054E170AE8E93D413605D22CDEC4ED5B797FB02F81CD48B2; '
  10. 'AHeadUserInfo=VipGrade=0&VipGradeName=%C6%D5%CD%A8%BB%E1%D4%B1&UserName'
  11. '=&NoReadMessageCount=1; '
  12. 'ticket_ctrip=bJ9RlCHVwlu1ZjyusRi+ypZ7X2r4+yojf8+FNH0TlNK2lS6fMZcgBjOfHqOhN9VpAJLwYTgYZVN'
  13. '/u6X+l132+vg2Xlxcp1LYFuVcdKpzUwDaZF4j1LNLhv3Qrm/Q1CxXKNUkGdO8t+p14Fq8ocNgc'
  14. '/1tndyayRxPC7Hbk7nOcRlB7SjpAK7CxhaWlezTsBPW8swUmgmLjQw8VxXOoyKa4Ot1KmooeNSxWuKTaPoRi3IriAk4K6q+s7Re+0vnsaoEdJKKlBcT8Im2q/qiqiIgHHadUTEOLY/r1o7giPW1OsM=; DUID=u=946C2AF9C69255585A4E2BA9D4748007&v=0; IsNonUser=F; UUID=CDA7973A53CD429FAC0FC5E0375A90FD; IsPersonalizedLogin=T; intl_ht1=h4=110_542266,32_69427876,2_67428455,189_2305879; nfes_isSupportWebP=1; __utmz=1.1612767978.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=1.1766539034.1611537972.1612767978.1612772639.2; MKT_Pagesource=PC; HotelCityID=6split%E5%A4%A7%E8%BF%9EsplitDaliansplit2021-2-17split2021-02-18split0; _uetvid=b5d59470652811ebb72abd785fd31b0f; MKT_OrderClick=ASID=4897155952&AID=4897&CSID=155952&OUID=index&CT=1613553301703&CURL=https%3A%2F%2Fwww.ctrip.com%2F%3Fsid%3D155952%26allianceid%3D4897%26ouid%3Dindex&VAL={"pc_vid":"1611537968607.3mstbz"}; StartCity_Pkg=PkgStartCity=3; _RF1=120.243.1.11; MKT_CKID_LMT=1613695946300; _gid=GA1.2.369548074.1613695947; Union=AllianceID=4897&SID=130026&OUID=&createtime=1613696002&Expires=1614300802290; Session=smartlinkcode=U130026&smartlinklanguage=zh&SmartLinkKeyWord=&SmartLinkQuary=&SmartLinkHost=; appFloatCnt=136; _jzqco=%7C%7C%7C%7C1613695946527%7C1.1293005571.1611537971410.1613720413087.1613720660846.1613720413087.1613720660846.undefined.0.0.191.191; __zpspc=9.28.1613720413.1613720660.2%232%7Cwww.baidu.com%7C%7C%7C%7C%23; _bfa=1.1611537968607.3mstbz.1.1613722589635.1613724791132.23.420; _bfs=1.12; _bfi=p1%3D600000435%26p2%3D10650025927%26v1%3D420%26v2%3D419 '
  15. }

4.start_requests(self) 中对所产生的url进行逐个获取数据

代码如下(示例):

5.对不同页面获取的html使用正则表达式来获取json数据

1. 正则表达式的使用我选择用取头取尾来获取这样的正则在90%都是实用的,

2 .再使用字符串方法strip删除头和尾就取到了我们需要的json数据

6.我们遇到的第一个错觉

1.并不是每个数据都是可以从html中获取的,这里遇到的难题为该价格使用js实时计算出行价格所以我们需要进入这个页面来获取此页面的json数据

2.因为是实时计算获取我们使用正则表达式和time库结合再json数据中获取每天已计算好的价格(只获取了前10天的数据)

7.处理好和采集出我们想要的数据后需要把数据放入数据库中,这里我采用mysql来存储数据

1.再scrapy框架中item实现定义好所要获取的类

2.为了定义常用的输出数据,Scrapy提供了Item类。Item对象是种简单的容器,保存了爬取得到的数据。

3.在scrapy框架蓝图中设置我们的君子协议,(我不是君子......)

设置好robots协议和下载的秒数

4.在管道文件中我们来将数据放入到mysql中

8.我们来测试代码...........


总结

1.使用scrapy框架方便了我们对页面数据的获取和,对海量url我们可以开启线程,不过一定要遵守网络安全法

2.改文章只提供学习,不可使用数据进行售卖,尊重别人的知识产权

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/885274
推荐阅读
相关标签
  

闽ICP备14008679号