请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

405报错

import requests

url = " http://www.xiaomishu.com/app/download/"

headers = {
    # 'host': "akesudiqu.xiaomishu.com",
    'upgrade-insecure-requests': "1",
    'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
    }
while True:
    response = requests.request("GET", url, headers=headers)

    print(response.text)

老师您好,requests代码如上面,能一直运行不会封锁,这个请求的url是来自scrapy请求的link。

但是scrapy  spider文件如下,就以运行就报405,

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
import re
from pybloom_live import BloomFilter
from scrapy.http import Request, FormRequest, HtmlResponse

download_bf = BloomFilter(1024*1024*16, 0.01)


class XiaomishuSpider(CrawlSpider):
    name = 'xiaomishu'
    start_url = 'http://www.xiaomishu.com/citylist/'
    pattern = re.compile(r'xiaomishu\.com/shop/\w{12}/', re.DOTALL)

    rules = (
        Rule(LinkExtractor(allow=r'xiaomishu', deny=(r'links.aspx', )),
             callback='parse_item', follow=True),
    )

    headers = {
        'upgrade-insecure-requests': "1",
        'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
    }

    def start_requests(self):
        
        yield scrapy.Request(self.start_url, headers=self.headers)

    def _requests_to_follow(self, response):

        if not isinstance(response, HtmlResponse):
            return
        seen = set()
        for n, rule in enumerate(self._rules):
            links = [l for l in rule.link_extractor.extract_links(response) if l not in seen]
            if links and rule.process_links:
                links = rule.process_links(links)
            for link in links:
                seen.add(link)
                r = Request(url=link.url, callback=self._response_downloaded, headers=self.headers)
                r.meta.update(rule=n, link_text=link.text)
                yield rule.process_request(r)

    def parse_item(self, response):

        result = self.pattern.findall(response.text)
        if len(result) >= 1:
            print(result)
            for res in result:
                try:
                    if res not in download_bf:
                        download_bf.add(res)
                        print(res)
                    else:
                        print('数据已存在')
                except ValueError:
                    pass

上面scrapy代码,报405的链接,都能带到requests那个代码里一直运行。不知道为什么scrapy里报405?

正在回答

1回答

bobby 2018-05-18 14:45:54

如果你看过的生鲜电商的课程 就会知道http的每个状态码都是有意义的 405就是方法出错 比如你的一个url只能接收post方法 你用get方法取访问就会出现405 反之也一样

0 回复 有任何疑惑可以回复我~
  • 提问者 慕丝8011162 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-05-18 15:57:06
  • 提问者 慕丝8011162 #2
    找到原因了,不是请求方式不对,不是混用了get  post。把setting文件的cookie enable设置为True就可以了。不懂为什么这样就好了。
    回复 有任何疑惑可以回复我~ 2018-05-18 15:59:07
  • bobby 回复 提问者 慕丝8011162 #3
    好的, 那应该是检查了cookie了
    回复 有任何疑惑可以回复我~ 2018-05-21 11:15:26
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信