pyspider 调用PhantomJS 进行DOM 操作?

发布于 2022-09-06 03:44:06 字数 2455 浏览 21 评论 0

代码:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2017-09-28 01:03:55


from pyspider.libs.base_handler import *
import re

import random

import requests



class Handler(BaseHandler):    
    headers= {
                          "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding":"gzip, deflate, sdch",
    "Accept-Language":"zh-CN,zh;q=0.8",
    "Cache-Control":"max-age=0",
    "Connection":"keep-alive",
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
    }
        
        
        
    crawl_config = {
        "timeout" : 20000,
        
        "headers" : headers,
        
    }

    @every(minutes=24 * 60)
    def on_start(self):
        url = ['http://36.48.62.24:8704/DataQuery/doublePublicity/sgsBm/jilin_xzcf',
               'http://36.48.62.24:8704/DataQuery/doublePublicity/sgsDq/jilin_xzcf'
              ]
        for i in url:
            self.crawl(i,callback=self.index_page,timeout = 200,fetch_type='js')

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('*').items():
            if each.attr.href:
                if re.findall(r'sjly',each.attr.href):
                   
                #url = 'http://cxcj.creditbj.gov.cn/%s'%each.attr.value1
                    self.crawl(each.attr.href, callback=self.index_page2,timeout = 200,fetch_type='js')
                    
                    
    @config(age=10 * 24 * 60 * 60)
    def index_page2(self, response):
        for each in response.doc('*').items():
            if each.attr.href:
                if re.findall(r'sgsDataInfo/jilin_xzcf',each.attr.href):
                    self.crawl(each.attr.href, callback=self.detail_page,timeout = 200,fetch_type='js')
        
        self.crawl('%s#more'%(response.url), callback=self.index_page2,timeout = 2000,fetch_type='js', js_script="""
                    function() {document.querySelectorAll("span > .f_black")[document.querySelectorAll("span > .f_black").length-2].click();}""")
                      

    @config(priority=5)
    def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('title').text(),
            "text": response.doc('td').text(),
        }

执行的是一个向下翻页的功能,测试的时候偶尔会生效,不知道是什么原因造成的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

抱着落日 2022-09-13 03:44:06

找到问题了,执行一次是没有问题的,但是在重复执行的时候也都是从 第一页开始往下翻页的,所以永远只会在1页和2页之间循环。问题就出在这。
找到问题,但是目前并没有解决。
我知道可以通过 抓包post数据去实现,但是我想试着通过js去解决。

橘虞初梦 2022-09-13 03:44:06

这个问题我有个解决方案,就是拿JS脚本 间隔一秒点一次,循环增加TIMEOUT的时间,在网址后面加#+str(i)这样进行去重,问题是爬任何网站翻页都是一个0.5N^2这个效率,我认为除非动用selenium翻页,用JS直接间隔翻页再爬的缺陷就在这里。pyspider只能爬取JS脚本执行完点击结束后的页面。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文