错误:尝试使用杂乱的

时间:2015-08-15 08:25:26

标签: python scrapy

问题描述:

我想从我大学的bbs中抓取一些信息。这是地址:http://bbs.byr.cn 下面是我的蜘蛛的代码:

from lxml import etree
import scrapy
try:
from scrapy.spiders import Spider
except:
from scrapy.spiders import BaseSpider as Spider
from scrapy.http import Request

class ITJobInfoSpider(scrapy.Spider):
name = "ITJobInfoSpider"
start_urls = ["http://bbs.byr.cn/#!login"]

def parse(self,response):
    return scrapy.FormRequest.from_response(
        response,
        formdata={'method':'post','id': 'username', 'passwd':'password'},
        formxpath='//form[@action="/login"]',
        callback=self.after_login
)

def after_login(self,response):
    print "######response body: " + response.body +"\n"
    if "authentication failed" in response.body:
        print "#######Login failed#########\n"
    return

但是,使用此代码,我经常会收到错误:引发ValueError(“在%s中找不到元素”%响应)

我的调查:

我发现当scrapy尝试解析url的HTML代码时发生此错误:http://bbs.byr.cn,scrappy用lxml解析页面。以下是代码

root = LxmlDocument(response, lxml.html.HTMLParser)
forms = root.xpath('//form')
if not forms:
    raise ValueError("No <form> element found in %s" % response)

所以我用代码查看代码:     print etree.tostring(root) 并发现HTML元素:</form>被解析为&lt;/form&gt; 难怪代码forms = root.xpath('//form')将返回一个空表单列表。

  

但我不知道为什么会这样,也许是HTML代码编码? (HTML代码使用GBK编码,而不是UTF8。)   感谢任何可以帮助我的人吗?顺便说一句,如果有人想要针对网站编写代码,我可以给你一个测试帐户,请在评论中留下我的电子邮件地址。

非常感谢,伙计!!

1 个答案:

答案 0 :(得分:0)

似乎发生了一些JavaScript重定向。

在这种情况下,使用Splash可能会过大。只需将/index附加到起始URL:http://bbs.byr.cn → http://bbs.byr.cn/index

这将是完整的工作蜘蛛:

from scrapy import Spider
from scrapy.http import FormRequest

class ByrSpider(Spider):
    name = 'byr'
    start_urls = ['http://bbs.byr.cn/index']

    def parse(self, response):
        return FormRequest.from_response(
            response,
            formdata={'method':'post','id': 'username', 'passwd':'password'},
            formxpath='//form[@action="/login"]',
            callback=self.after_login)

    def after_login(self, response):
        self.logger.debug(response.text)
        if 'authentication failed' in response.text:
            self.logger.debug('Login failed')