Asyncpy使用文档 Demo

1 创建项目

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

安装命令:

pip install asyncpy

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

创建项目命令:

asyncpy genspider demo

创建一个名为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   # 新版不指定配置文件也会读取settings.py

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

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

DemoSpider.start()

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

2.2 使用start_requests发送POST请求

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

from asyncpy.spider import Spider
import settings

class DemoSpider(Spider):
    name = 'demo'
    settings_attr = settings   # # 新版不指定配置文件也会读取settings.py

    start_urls = []

    async def start_requests(self):
        url = 'http://httpbin.org/post'
        yield self.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()

响应结果:
可以看到我们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})

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

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

from asyncpy.spider import Spider
import settings
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 self.request(callback=self.parse,url=url,method="POST",data={"Say":"Hello Asyncpy"})

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

DemoSpider.start(middleware=middleware)

运行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"})

运行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               日志等级
"""

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

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

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

from asyncpy.spider import Spider
import settings
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 self.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)

5 生成日志文件

5.1 修改settings配置

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

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

5.2 多个爬虫指定日志文件

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

这里跟上面相同,针对指定爬虫文件的日志,需要删除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(''))

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 self.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)
# -*- coding: utf-8 -*-
# pipelines文件
class SpiderPipeline():
    def __init__(self):
        pass

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

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()

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

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

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
文件: import scrapy from demo1.items import Demo1Item import urllib from scrapy import log # BOSS直聘网站爬虫职位 class DemoSpider(scrapy.Spider): # 爬虫名, 启动爬虫时需要的参数*必填 name = 'demo' # 爬取域范围,允许爬虫在这个域名下进行爬取(可选) allowed_domains = ['zhipin.com'] # 爬虫需要的url start_urls = ['https://www.zhipin.com/c101280600/h_101280600/?query=测试'] def parse(self, response): node_list = response.xpath("//div[@class='job-primary']") # 用来存储所有的item字段 # items = [] for node in node_list: item = Demo1Item() # extract() 将xpath对象转换为Unicode字符串 href = node.xpath("./div[@class='info-primary']//a/@href").extract() job_title = node.xpath("./div[@class='info-primary']//a/div[@class='job-title']/text()").extract() salary = node.xpath("./div[@class='info-primary']//a/span/text()").extract() working_place = node.xpath("./div[@class='info-primary']/p/text()").extract() company_name = node.xpath("./div[@class='info-company']//a/text()").extract() item['href'] = href[0] item['job_title'] = job_title[0] item['sa 报错: C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\python.exe "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\pydevconsole.py" --mode=client --port=55825 import sys; print('Python %s on %s' % (sys.version, sys.platform)) sys.path.extend(['C:\\Users\\xieqianyun\\demo1', 'C:/Users/xieqianyun/demo1']) Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] Type 'copyright', 'credits' or 'license' for more information IPython 7.10.0 -- An enhanced Interactive Python. Type '?' for help. PyDev console: using IPython 7.10.0 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 runfile('C:/Users/xieqianyun/demo1/demo1/begin.py', wdir='C:/Users/xieqianyun/demo1/demo1') Traceback (most recent call last): File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\IPython\core\interactiveshell.py", line 3319, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-2-fc5979762143>", line 1, in <module> runfile('C:/Users/xieqianyun/demo1/demo1/begin.py', wdir='C:/Users/xieqianyun/demo1/demo1') File "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile pydev_imports.execfile(filename, global_vars, local_vars) # execute the script File "C:\Users\xieqianyun\PyCharm Community Edition 2019.2.5\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "C:/Users/xieqianyun/demo1/demo1/begin.py", line 3, in <module> cmdline.execute('scrapy crawl demo'.split()) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\cmdline.py", line 145, in execute cmd.crawler_process = CrawlerProcess(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 267, in __init__ super(CrawlerProcess, self).__init__(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 145, in __init__ self.spider_loader = _get_spider_loader(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\crawler.py", line 347, in _get_spider_loader return loader_cls.from_settings(settings.frozencopy()) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 61, in from_settings return cls(settings) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 25, in __init__ self._load_all_spiders() File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\spiderloader.py", line 47, in _load_all_spiders for module in walk_modules(name): File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\site-packages\scrapy\utils\misc.py", line 73, in walk_modules submod = import_module(fullpath) File "C:\Users\xieqianyun\AppData\Local\Programs\Python\Python36\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 994, in _gcd_import File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "C:\Users\xieqianyun\demo1\demo1\spiders\demo.py", line 4, in <module> from scrapy import log ImportError: cannot import name 'log'
很抱歉,我没有现成的 CEF3 集成 MFC 多文档demo。不过,下面是一个简单的示例,可以帮助你了解如何将 CEF3 集成到 MFC 多文档应用程序中。 1. 下载 CEF3 的最新版本,并解压到本地。 2. 在 MFC 应用程序中添加一个 WebBrowser 控件(可以通过“工具箱”中的“WebBrowser”工具添加)。 3. 在 WebBrowser 控件的创建事件中,创建一个 CefBrowser 对象,并将其绑定到 WebBrowser 控件上。示例代码如下: ```c++ // 在 MFC 应用程序的某个类中添加以下代码: CefRefPtr<CefBrowser> m_pBrowser; // 声明 CefBrowser 对象 // 在 WebBrowser 控件的创建事件中添加以下代码: CefMainArgs mainArgs; // CEF 的主要参数 CefRefPtr<CefApp> app; // CEF 应用程序对象(自定义) CefSettings settings; // CEF 的设置选项 CefInitialize(mainArgs, settings, app); // 初始化 CEF CefWindowInfo windowInfo; // CEF 窗口信息 windowInfo.SetAsChild(m_hWnd, rect); // 将 CEF 窗口绑定到 WebBrowser 控件 CefBrowserSettings browserSettings; // CEF 浏览器设置 m_pBrowser = CefBrowserHost::CreateBrowserSync(windowInfo, handler.get(), url, browserSettings, nullptr); // 创建 CefBrowser 对象,并绑定到 WebBrowser 控件 ``` 4. 在 MFC 应用程序中添加一个自定义文档类(比如 CMyHtmlDoc),用于加载和显示 HTML 页面。 5. 在 CMyHtmlDoc 的 OnNewDocument() 函数中,创建一个 CefFrame 对象,将其绑定到 CefBrowser 对象上,然后使用 CefFrame::LoadURL() 函数加载 HTML 页面。示例代码如下: ```c++ // CMyHtmlDoc::OnNewDocument() 函数 CefRefPtr<CefFrame> frame = m_pBrowser->GetMainFrame(); // 获取 CefBrowser 的主框架 frame->LoadURL(url); // 加载 HTML 页面 ``` 6. 在 CMyHtmlDoc 的 OnDraw() 函数中,使用 CefBrowser::GetImage() 函数获取 HTML 页面的截图,并在文档视图中显示。示例代码如下: ```c++ // CMyHtmlDoc::OnDraw() 函数 CefRefPtr<CefBrowser> browser = GetBrowser(); // 获取 CefBrowser 对象 CefRefPtr<CefBrowserHost> host = browser->GetHost(); // 获取 CefBrowserHost 对象 CefRect rect(0, 0, host->GetWindowHandle(), host->GetWindowHandle()); // 截图区域 CefRefPtr<CefBrowser> image = host->GetImage(PET_VIEW, 1, rect); // 获取截图 CefRefPtr<CefImage> cefImage = image->GetImage(); // 获取 CefImage 对象 HBITMAP hBitmap = cefImage->GetHBITMAP(1.0, false, false); // 将 CefImage 转换为 HBITMAP CDC* pDC = GetDC(); // 获取文档视图的设备上下文 CBitmap bitmap; bitmap.Attach(hBitmap); CBrush brush; brush.CreatePatternBrush(&bitmap); pDC->FillRect(&m_rectDraw, &brush); // 在文档视图中显示截图 ReleaseDC(pDC); ``` 以上代码仅供参考,具体实现细节可能因应用程序的需求而有所不同。希望这些信息对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考古学家lx(李玺)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值