Scrapy 入门指南 一:安装与简单使用
相关资料以及学习方法
官方文档https://scrapy-chs.readthedocs.io/zh_CN/latest/
最好的老师:chatgpthttps://chat.openai.com/
一定要看官方文档
安装以及环境搭建
前期准备: python环境,windows系统,ide工具(pycharm),可以正常上网的网络
Scrapy安装:
#安装scrapy
pip install scrapy
#自动生成基础模板
scrapy startproject mySprider
#生成文件--->
myproject/ # 项目的根目录
scrapy.cfg # Scrapy的配置文件,包含项目的全局设置
myproject/ # 项目的Python模块
__init__.py # 空文件,用于标识myproject目录为Python模块
items.py # 定义项目中使用的数据项(Item)
pipelines.py # 定义项目中的管道(Pipeline)
middlewares.py # 定义项目中的中间件(Middleware)
settings.py # 爬虫、管道、中间件,日志,优先级,http等配置文件设置
spiders/ # 存放爬虫的目录
__init__.py # 空文件,用于标识spiders目录为Python模块
spider1.py # 爬虫1的代码
spider2.py # 爬虫2的代码
使用
# 进入项目
cd ./myproject
# 生成spider
scrapy genspider mysprider "你的网址"
# 查看所有目录
scrapy -h
常用命令
命令行工具(Command line tools) — Scrapy 0.24.1 文档
添加修改 mysprider
使用xpath在response获取需要的信息
xpath语法
XPath 教程 | 菜鸟教程
xpath是提取html(xml)语言的主要途径,总结需要提取标签的特点
举一个简单的例子,这是一个官网的爬虫例子(这个网址已经失效,需要你自己更换网址和xpath)
import scrapy
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
for sel in response.xpath('//ul/li'):
title = sel.xpath('a/text()').extract()
link = sel.xpath('a/@href').extract()
desc = sel.xpath('text()').extract()
print title, link, desc
在items.py定义需要保存的数据
tems是scrapy框架官方规范的爬取数据的格式
import scrapy
class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
修改你的spider
import scrapy
from myspider.items import DmozItem
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
for sel in response.xpath('//ul/li'):
item = DmozItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
yield item
本地导入失败解决方法
https://blog.csdn.net/junbaba_/article/details/105855625
将根目录文件夹标记为源代码目录
在setting.py修改日志等级
# 设置日志级别为DEBUG
LOG_LEVEL = 'DEBUG'
let’s try
运行命令
scrapy crwal yousprider -o output.json
保存到output.json文件
添加自定义的保存方式
在pipeline.py添加自定义的保存方式
class TxtExporterPipeline:
def open_spider(self, spider):
self.file = open('output.txt', 'w', encoding='utf-8')
def close_spider(self, spider):
self.file.close()
def process_item(self, item, spider):
# 将item的数据写入到txt文件中
self.file.write(str(item) + '\n')
return item
再在setting中添加并且修改TxtExporterPipeline的优先级
ITEM_PIPELINES = {
# "mySpider.pipelines.MyspiderPipeline": 300, # 优先级为300
'mySpider.pipelines.TxtExporterPipeline': 800, # 将Item导出为txt的内置Pipeline
# 'mySpider.pipelines.JsonWriterPipelineV2': 900
}
伪装请求头,破解部分反扒机制
部分网站的反扒是通过请求的headers的识别爬虫
我们可以通过在scrapy的中间件设置middlewares.py引入fake_useragent库生成随机的useragent
在middlewares.py添加
# -----------------------自定义的中间件处理-----------------------------------------
class CustomSpiderDownloaderMiddleware(UserAgentMiddleware):
# Not all methods need to be defined. If a method is not defined,
# scrapy acts as if the downloader middleware does not modify the
# passed objects.
@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware.
ua = UserAgent()
# 生成随机的UserAgent
# request.headers['User-Agent'] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, " \
# "like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50 "
request.headers['User-Agent'] = ua.random
# Must either:
# - return None: continue processing this request
# - or return a Response object
# - or return a Request object
# - or raise IgnoreRequest: process_exception() methods of
# installed downloader middleware will be called
return None
def process_response(self, request, response, spider):
# Called with the response returned from the downloader.
# Must either;
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest
return response
def process_exception(self, request, exception, spider):
# Called when a download handler or a process_request()
# (from other downloader middleware) raises an exception.
# Must either:
# - return None: continue processing this exception
# - return a Response object: stops process_exception() chain
# - return a Request object: stops process_exception() chain
pass
def spider_opened(self, spider):
spider.logger.info("Spider opened: %s" % spider.name)
同理在setting.py添加并设置中间件优先级
DOWNLOADER_MIDDLEWARES = {
"mySpider.middlewares.CustomSpiderDownloaderMiddleware": 542,
}
如何参看自己的xpath是否正确?
在官方文档中,有一个提供调试的模式
https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/shell.html
在终端输入
scrapy shell <url>
使用命令
response.xpath("youXpath")
参看是否返回需要的信息
如果没有Xpath有几种情况
1.xpath路径错误
2.部分数据需要调用js脚本生成中
3.部分数据是额外调用接口生成
解决方法
使用一个支持 JavaScript 执行的库,例如 Selenium。Selenium 是一个自动化测试工具,可以模拟用户在浏览器中执行操作,包括执行 JavaScript 脚本。你可以使用 Selenium 控制浏览器加载页面,并执行页面上的 JavaScript,然后提取你需要的内容。
查看页面源代码和网络请求。有时,网站会在加载页面时通过 AJAX 请求获取数据。你可以分析页面的网络请求,找到返回数据的 API 或其他请求,然后直接发送请求获取数据,而无需执行 JavaScript 脚本。
考虑使用与目标网站交互的 API。有些网站提供了 API,可以直接从 API 获取数据,而无需解析 HTML 或执行 JavaScript。
下一篇
如何对网址列表,子网页等进行反复的爬取(暂定)
如何提升爬取效率(暂定)
队列和分布式爬取(暂定)