Asyncpy使用文档 Demo

举报
冬晨夕阳 发表于 2022/03/30 00:47:42 2022/03/30
【摘要】 Asyncpy使用文档 1 创建项目2 发送get和post请求2.1 使用start_urls发送GET请求2.2 使用start_requests发送POST请求 3 自定义请求头3.1...

1 创建项目

安装需要的环境 python版本需要 >=3.6

安装命令:

pip install asyncpy

  
 
  • 1

安装完成之后,可以开始创建一个爬虫项目。

创建项目命令:

asyncpy genspider demo

  
 
  • 1

创建一个名为demo的项目。

创建成功之后, 打开项目文件,项目结构如下图所示:
在这里插入图片描述


2 发送get和post请求

2.1 使用start_urls发送GET请求

在start_url 列表中添加一个链接。
在parse中,打印出响应状态码和内容。

# -*- coding: utf-8 -*-

from asyncpy.spider import Spider
import settings


class DemoSpider(Spider):
    name = 'demo'
    settings_attr = settings

    start_urls = ['http://httpbin.org/get']

    async def parse(self, response):
        print(response.status)
        print(response.text)

DemoSpider.start()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

右键点击运行即可完成请求抓取。

2.2 使用start_requests发送POST请求

导入Asyncpy的Request模块,清空start_urls ,然后重写 start_requests方法完成Post请求。

from asyncpy.spider import Spider
import settings
from asyncpy.spider import Request

class DemoSpider(Spider):
    name = 'demo'
    settings_attr = settings

    start_urls = []

    async def start_requests(self):
        url = 'http://httpbin.org/post'
        yield Request(callback=self.parse,url=url,method="POST",data={"Say":"Hello Asyncpy"})

    async def parse(self, response):
        print(response.status)
        print(response.text)

DemoSpider.start()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

响应结果:
可以看到我们Post提交的参数。
在这里插入图片描述


3 自定义请求头

这里以修改请求头中的User-Agent为例子,从上面的图中可以看出当前的User-Agent是aiohttp默认的用户代理。

3.1 settings中设置请求头

打开settings文件,找到最下面的 USER_AGENT 参数,解开注释后,添加一个浏览器的UA。

3.2 在middlewares中添加请求头

打开middlewares文件,找到UserAgentMiddleware方法(默认有),也可以自定义一个方法。

# -*- coding: utf-8 -*-
from asyncpy.middleware import Middleware
from asyncpy.request import Request
from asyncpy.spider import Spider

middleware = Middleware()

@middleware.request
async def UserAgentMiddleware(spider:Spider, request: Request):
    ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36"
    request.headers.update({"User-Agent": ua})

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

然后到spider爬虫文件中(demo.py),引入middlerwares文件中的 middleware 。 在start启动方法中传入middleware 。

# -*- coding: utf-8 -*-

from asyncpy.spider import Spider
import settings
from asyncpy.spider import Request
from middlewares import middleware

class DemoSpider(Spider):
    name = 'demo'
    settings_attr = settings

    start_urls = []

    async def start_requests(self):
        url = 'http://httpbin.org/post'
        yield Request(callback=self.parse,url=url,method="POST",data={"Say":"Hello Asyncpy"})

    async def parse(self, response):
        print(response.text)

DemoSpider.start(middleware=middleware)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

运行demo.py,可以看到当前的 “User-Agent” 已经更改为我们自定义的UA。
在这里插入图片描述

3.3 添加代理IP

和3.1.1类似,打开middlewares文件,在方法下添加代理。(可以重新定义一个方法)
注意是在aiohttp_kwargs中添加proxy。记得在start方法中传入middleware。

@middleware.request
async def UserAgentMiddleware(spider:Spider, request: Request):
    ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36"
    request.headers.update({"User-Agent": ua})
    request.aiohttp_kwargs.update({"proxy": "http://49.85.98.209:4253"})

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

运行demo.py,可以看到当前的 IP 已经更改为我们自定义的proxy。(该代理ip已过期)
在这里插入图片描述


4 修改并发延时重试等配置

4.1 修改settings中的配置

settings文件中有以下可支持的配置,可以自己具体修改。

"""
CREATE YOUR DEFAULT_CONFIG !

Some configuration:
        CONCURRENT_REQUESTS     并发数量
        RETRIES                 重试次数
        DOWNLOAD_DELAY          下载延时
        RETRY_DELAY             重试延时
        DOWNLOAD_TIMEOUT        超时限制
        USER_AGENT              用户代理
        LOG_FILE                日志路径
        LOG_LEVEL               日志等级
"""

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4.2 修改指定爬虫文件的配置

如果需要对不同爬虫文件进行不同的配置,可以使用 custom_settings 在爬虫文件中自定义配置。
并且需要在yield中,传入custom_settings。才能使自定义配置生效。

# -*- coding: utf-8 -*-

from asyncpy.spider import Spider
import settings
from asyncpy.spider import Request
from middlewares import middleware

class DemoSpider(Spider):
    name = 'demo'
    settings_attr = settings
    custom_settings = {
        "DOWNLOAD_TIMEOUT":60,
        "RETRIES":3
    }

    start_urls = []

    async def start_requests(self):
        url = 'http://httpbin.org/post'
        yield Request(callback=self.parse,url=url,
                      method="POST",
                      data={"Say":"Hello Asyncpy"},
                      custom_settings=self.custom_settings
                      )

    async def parse(self, response):
        print(response.text)

DemoSpider.start(middleware=middleware)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

5 生成日志文件

5.1 修改settings配置

# '''生成日志文件'''
# LOG_FILE = '../asyncpy.log'
# LOG_LEVEL = 'DEBUG'

  
 
  • 1
  • 2
  • 3

全局日志可以在settings文件中配置生成。

5.2 多个爬虫指定日志文件

    custom_settings = {
        "LOG_FILE" : "../asyncpy.log"
    }

  
 
  • 1
  • 2
  • 3

这里跟上面相同,针对指定爬虫文件的日志,需要删除settings的日志配置,然后再通过custom_settings进行配置,如果不指定LOG_LEVEL 的话,日志等级默认为INFO


6 解析response提取数据

我引入了scrapy中的parsel解析模块,所以这里默认的解析方法和scrapy相同。
也可以自己选择其他方法。

    async def parse(self, response):
        print(response.text)
        print(response.xpath('//text()'))
        print(response.css(''))

  
 
  • 1
  • 2
  • 3
  • 4

6.1 response.text

返回页面文本内容,可以导入正则模块进行匹配

6.2 response.xpath(’’)

  • getall() : 返回的是一个list,里面包含了多个string
  • get() : 返回的是string,list里面第一个string
  • extract() 等于 getall()
  • extract_first() 等于 get()

6.3 response.css()、response.re()

parsel.css选择器和parsel.re,可自行查找使用方法。


7 使用pipelines保存数据

使用回调方法,判断yield的是否是dict类型的item,是则使用pipelines进行数据的保存处理。

  • 首先定义一个item,然后使用yield回调item。
  • 项目的pipelines文件中默认有SpiderPipeline类。导入SpiderPipeline,传入start()启动管道。
# -*- coding: utf-8 -*-
# 爬虫文件
from asyncpy.spider import Spider
import settings
from asyncpy.spider import Request
from middlewares import middleware
from pipelines import SpiderPipeline

class DemoSpider(Spider):
    name = 'demo'
    settings_attr = settings
    start_urls = []

    async def start_requests(self):
        url = 'http://httpbin.org/post'
        yield Request(callback=self.parse,url=url,
                      method="POST",
                      data={"Say":"Hello Asyncpy"},
                      custom_settings=self.custom_settings
                      )

    async def parse(self, response):
        item = {}
        item['text'] = response.text
        yield item
DemoSpider.start(middleware=middleware,pipelines=SpiderPipeline)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
# -*- coding: utf-8 -*-
# pipelines文件
class SpiderPipeline():
    def __init__(self):
        pass

    def process_item(self, item, spider_name):
        print(item)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

8 启动多个爬虫

目前可以使用多进程的方式启动多个爬虫文件。
创建一个test文件,导入两个爬虫文件的Spider,使用multiprocessing进行启动。

from Demo.demo import DemoSpider
from Demo.demo2 import DemoSpider2
import multiprocessing

def open_DemoSpider2():
    DemoSpider2.start()

def open_DemoSpider():
    DemoSpider.start()

if __name__ == "__main__":
    p1 = multiprocessing.Process(target = open_DemoSpider)
    p2 = multiprocessing.Process(target = open_DemoSpider2)
    p1.start()
    p2.start()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

感兴趣的朋友点赞或者留言吧,也可以去github点个star支持一下!

链接 : https://github.com/lixi5338619/asyncpy

文章来源: blog.csdn.net,作者:考古学家lx,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_43582101/article/details/106320674

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。