更多优秀文章借鉴:
导航小助手
1. 目标网址:
2. 准备工作:
3. 思路分析:
4. 编写相关的爬虫框架规则:
目标网址:
https://travel.qunar.com/travelbook/list.htm?page=1&order=hot_heat
准备工作:
1.按住按win+r,在弹出框里输入cmd。
2.进入下图界面,默认为C盘,使用cd \d +目标路径即可进入自己指定的文件夹下。
3.在自己指定的文件夹下输入scrapy startproject qunar,利用scrapy框架创建qunar文件。
4.切换到项目qunar的根目录,输入命令:scrapy genspider qunarspider https://travel.qunar.com/travelbook/list.htm?page=1&order=hot_heat
以爬虫起始地址创建脚本文件,用于编写采集规则。如下图所示:
3.创建好后如下图所示,表示爬虫基本框架已经搭建完毕,即可写入脚本以及相应的爬虫规则。
思路分析:
1.打开去哪网游客博主发布游记主页面,通过谷歌开发者工具可观察到每一条记录都在"li"标签下面;目标字段有标题、作者、时间、人均费用等。
结论:观察可得到,当前网页以page进行分页,且每一个li标签存储着每一篇游记的相关信息。
2.打开网页源代码,搜索相关关键信息:
结论:观察得出,此网页为静态网页,可直接利用正则表达式、Xpath等解析方式通过返回源代码直接获取相关信息。
编写相关的爬虫框架规则:
1.在items.py中确定提取的相关字段:
import scrapy
class QunarItem(scrapy.Item):
Title = scrapy.Field() # Title:文章标题
Comment = scrapy.Field()# Comment:作者名称
TravelLink = scrapy.Field()# TravelLink:标题的链接
Date = scrapy.Field()# Date:出发日期
Days = scrapy.Field() # Days:旅游共几天
Photo_Nums = scrapy.Field()# Photo_Nums:照片数量
Fee = scrapy.Field()# Fee:人均消费
People = scrapy.Field()# People:适合人数
Places = scrapy.Field()# Places:途径地点
Views = scrapy.Field()# Views:评论人数
Love = scrapy.Field() # Love:点赞数
pass
2.在setting.py中确定相关爬取规则:
BOT_NAME = "Qunar"
SPIDER_MODULES = ["Qunar.spiders"]
NEWSPIDER_MODULE = "Qunar.spiders"
REDIRECT_ENABLED = False
#不遵守爬虫协议
ROBOTSTXT_OBEY = False
#设置等待时间,降低爬虫频率
DOWNLOAD_DELAY = 3
#引入用户代码,Cookie等设置请求头
DEFAULT_REQUEST_HEADERS = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en",
'Cookie':'xxx',
'User-Agent':'xxx'
}
#打开存储通道
ITEM_PIPELINES = {
"Qunar.pipelines.QunarPipeline": 300,
}
3.在pipelines.py中设置存储方式,这里使用MongoDB进行存储:
class QunarPipeline:
def __init__(self):
# 打开数据库,建立集合
self.client=pymongo.MongoClient('localhost',27017)
self.db=self.client['clj2']
self.Qunar_text=self.db['Qunar_text']
def process_item(self, item, spider):
adapter=ItemAdapter(item)
data=adapter.asdict()
self.Qunar_text.insert_one(data)
return item
4.在Qunarspider.py脚本中写入获取信息的主代码:
import time#引入time库,降低访问频率
import scrapy#引入爬虫框架scrapy库
from scrapy.selector import Selector#引用Selector方法,对目标response进行解析
from ..items import QunarItem#从父目录中导入QunarItem
class QunarSpider(scrapy.Spider):#编写QunarSpider类
name = 'Qunarspider'#唯一名字
# allowed_domains = ['travel.qunar.com']
start_urls = ['https://travel.qunar.com/travelbook/list.htm?page=1&order=hot_heat']#基地址
def parse(self, response):
selector=Selector(response)#对目标返回的response进行解析
item = QunarItem()#将在items.py定义好的相关字段赋值给变量item
infos=selector.xpath('//li[starts-with(@class,"list_item")]')#找到循环点,此处为记录每一条游记的标签
for info in infos:#进行循环
#经过大量实验可知,某些游记也许存在空值,为了程序的正常运行,则进行抛出异常处理
# 以获取标题为例:
try:
Title = info.xpath('.//h2[@class="tit"]/a/text()').extract()[0]#返回利用xpath已获取Title列表中的第一个元素
item['Title']=Title#赋值
time.sleep(1)#休息一秒
#回调item,对items.py中的字段进行赋值
yield item
except IndexError:
pass
urls=['https://travel.qunar.com/travelbook/list.htm?page={}&order=hot_heat'.format(str(i))for i in range(2,201)]#对目标网站进行字符串格式化
for url in urls:#循环
yield scrapy.Request(url)#利用循环的urlparse回调函数
5.控制台输出每一页爬取的游记博主发布的游记信息,正常运行:
6.打开MongoDB数据库的Qunar_text集合,如下图所示:
对数据进行导出为Csv格式,一共2000条数据,如下图所示:
注意:需要完整源代码请私聊博主哦~
创作不易,请点个赞哦~