Python逆向爬虫之scrapy框架,非常详细
作者:互联网
一、爬虫入门
那么,我相信初学的小伙伴现在一定是似懂非懂的。那么下面我们通过一个案例来慢慢进行分析
首先,我们第一步需要做的就是项目分析,我们来看看爬取这个网站我们需要哪些步骤。
1.1 定义需求
需求就是将该网站中所有的美女图片分类下载到本地。
1.2 需求分析
如果我们需要下载上面所表示的所有的图片的话,我们需要如下几个步骤:
- 下载某个页面上所有的图片
- 分页
- 进行下载图片
1.2.1 下载某个页面上所有的图片
# -*- coding: utf-8 -*- |
|
import requests |
|
from lxml import etree |
|
import urllib3 |
|
urllib3.disable_warnings() |
|
def getClassification(num): |
|
""" |
|
获取分类链接 |
|
:return: |
|
""" |
|
url = f"https://www.quanjing.com/tupian/meinv-{num}.html" |
|
html = sendRequest(url, "get") |
|
htmlValus = htmlAnalysis(html.text, '//*[@id="gallery-list"]/li') |
|
for item in htmlValus: |
|
imgUrl = item.xpath('./a/img/@src')[0] |
|
downLoad(imgUrl) |
|
def downLoad(url): |
|
""" |
|
下载图片 |
|
:param url: |
|
:return: |
|
""" |
|
img = sendRequest(url) |
|
imgName = url.split("@")[0].split("/")[-1] |
|
with open("./quanjing/" + imgName, 'wb') as imgValue: |
|
imgValue.write(img.content) |
|
def htmlAnalysis(html, rule): |
|
""" |
|
根据 xpath 获取数据 |
|
:param html: |
|
:param rule: |
|
:return: |
|
""" |
|
htmlValues = etree.HTML(html) |
|
value = htmlValues.xpath(rule) |
|
return value |
|
def sendRequest(url, method="get"): |
|
""" |
|
发送请求 |
|
:param url: |
|
:param method: |
|
:return: |
|
""" |
|
if method.lower() == "get": |
|
html = requests.get(url=url, headers=getHeader(), verify=False) |
|
elif method.lower() == "post": |
|
html = requests.post(url=url, headers=getHeader()) |
|
else: |
|
html = None |
|
return html |
|
def getHeader(): |
|
""" |
|
获取Header |
|
:return: |
|
""" |
|
ua_headers = { |
|
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', |
|
"referer": "https://www.quanjing.com/" |
|
} |
|
return ua_headers |
|
def main(): |
|
getClassification(1) |
|
if __name__ == '__main__': |
|
main() |
|
1.2.2 分页
def main(): |
|
for i in range(10): |
|
getClassification(i) |
|
1.2.3 进行下载图片
def downLoad(url): |
|
""" |
|
下载图片 |
|
:param url: |
|
:return: |
|
""" |
|
img = sendRequest(url) |
|
imgName = url.split("@")[0].split("/")[-1] |
|
with open("./quanjing/" + imgName, 'wb') as imgValue: |
|
imgValue.write(img.content) |
|
二、Scrapy 入门
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
上面的架构图明确的说明了 Scrapy 主要有 5 个部分。
- 引擎(Scrapy Engine):引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。
- 管道(Pipline):主要提供存储服务,把需要存储的数据存储到相关数据库之中。
- 调度器(Scheduler):主要提供两个功能,分别是 去重 和 队列。
- 下载器(Downloader):下载器负责获取页面数据并提供给引擎,而后提供给spider。
- 爬虫(Spiders):Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
其实除了上述的内容外,Scrapy 还提供一些中间件,例如:下载器中间件(Downloader Middlewares)和爬虫中间件(Spider Middlewares)等。
2.1 安装 Scrapy
在命令行模式下使用pip命令即可安装。