Scrapy webkit 获取js代码执行结果后再抓取

本文介绍如何在Scrapy中使用Webkit渲染JavaScript动态内容。通过安装必要组件及开发DownloaderMiddleware,实现对Ajax加载页面的抓取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在页面用ajax的越来越多, 好多代码是通过js执行结果显示在页面的, 所以在scrapy抓取过程中就需要通过一个中间件来执行这个js代码, 


这个可以通过scrapy webkit来完成.


安装scrapy:

sudo apt-get install python-scrapy(貌似安装的版本比较低)需要修改一下, 具体步骤访问下面的网址

http://doc.scrapy.org/en/latest/topics/ubuntu.html#topics-ubuntu


webkit的安装:

sudo apt-get install python-webkit


安装xvfb, 用于非Xwindows环境下

sudo apt-get install xvfb


开发downloader middleware

from scrapy.http import Request, FormRequest, HtmlResponse
 
import gtk
import webkit
import jswebkit
import settings
 
class WebkitDownloader( object ):
    def process_request( self, request, spider ):
        if spider.name in settings.WEBKIT_DOWNLOADER:
            if( type(request) is not FormRequest ):
                webview = webkit.WebView()
                webview.connect( 'load-finished', lambda v,f: gtk.main_quit() )
                webview.load_uri( request.url )
                gtk.main()
                js = jswebkit.JSContext( webview.get_main_frame().get_global_context() )
                renderedBody = str( js.EvaluateScript( 'document.body.innerHTML' ) )
                return HtmlResponse( request.url, body=renderedBody )


配置

在scrapy的settings.py中加入:

#which spider should use WEBKIT
WEBKIT_DOWNLOADER=['ccb']
 
DOWNLOADER_MIDDLEWARES = {
    'rate_crawler.dowloader.WebkitDownloader': 543,
}   
 
import os
os.environ["DISPLAY"] = ":0"


启动 Xvfb (假设DISPLAY=:0)

要与settings.py中的DISPLAY对应(本例中是:0)。

scrapy crawl xxx


使用 Scrapy 框架从社交媒体抓取用户信息是一项常见但具有挑战性的任务,尤其是在面对反爬虫机制和动态加载内容时。以下是一个详细的教程与示例代码,帮助你快速上手。 ### 1. 创建 Scrapy 项目 首先,确保已经安装了 Scrapy: ```bash pip install scrapy ``` 然后创建一个 Scrapy 项目,例如名为 `social_media_spider` 的项目: ```bash scrapy startproject social_media_spider cd social_media_spider ``` 接下来生成一个爬虫模板,假设目标网站是 Twitter(请注意,Twitter 有严格的 API 使用政策,直接爬取可能违反其服务条款): ```bash scrapy genspider twitter twitter.com ``` ### 2. 定义数据结构(Item) 在 `items.py` 文件中定义要抓取的数据字段,例如用户名、推文内容和发布时间: ```python import scrapy class TwitterItem(scrapy.Item): username = scrapy.Field() tweet_text = scrapy.Field() publish_time = scrapy.Field() ``` ### 3. 编写爬虫逻辑 打开 `spiders/twitter.py` 文件并编写爬虫逻辑。以下是一个简单的示例,用于抓取 Twitter 用户的推文内容(注意:实际环境中需要处理 JavaScript 渲染的内容,可以考虑结合 Selenium 或 Playwright): ```python import scrapy from social_media_spider.items import TwitterItem class TwitterSpider(scrapy.Spider): name = 'twitter' allowed_domains = ['twitter.com'] start_urls = [ 'https://twitter.com/username' # 替换为目标用户的主页链接 ] def parse(self, response): for tweet in response.css('div[data-testid="tweet"]'): item = TwitterItem() item['username'] = tweet.css('.css-901oao.css-16my406.r-poiln3.r-bcqeeo::text').get() item['tweet_text'] = tweet.css('.css-901oao.r-1qd0xg0.r-ad9z0x.r-bcqeeo.r-qvutc0::text').get() item['publish_time'] = tweet.css('time::attr(datetime)').get() yield item ``` ### 4. 配置 Scrapy 设置 在 `settings.py` 中启用下载中间件、User-Agent 设置以及自动限速功能以应对反爬机制: ```python USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0 Safari/537.36' DOWNLOAD_DELAY = 2 # 设置请求间隔为2秒 CONCURRENT_REQUESTS_PER_DOMAIN = 2 # 控制并发请求数量 # 启用自动限速扩展 AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_START_DELAY = 5 AUTOTHROTTLE_MAX_DELAY = 60 AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 AUTOTHROTTLE_DEBUG = False ``` ### 5. 处理动态内容(可选) 如果目标网站使用 JavaScript 动态加载内容,Scrapy 无法直接获取渲染后的 HTML。此时可以结合 **Selenium** 或 **Playwright** 来实现: #### 示例:使用 Playwright 作为 Scrapy 下载器 首先安装依赖: ```bash pip install scrapy-playwright playwright playwright install-deps ``` 然后在 `settings.py` 中添加: ```python DOWNLOAD_HANDLERS = { "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler", } PLAYWRIGHT_LAUNCH_OPTIONS = {"headless": True} PLAYWRIGHT_DEFAULT_NAVIGATION_TIMEOUT = 100000 ``` ### 6. 运行爬虫 最后运行爬虫并将结果保存到文件中: ```bash scrapy crawl twitter -o output.json ``` --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值