pyspider 调用PhantomJS 进行DOM 操作?

代码:

#!/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(),
        }

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

阅读 2.9k
2 个回答
新手上路,请多包涵

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进