请稍等 ...
×

采纳答案成功!

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

405报错

1
2
3
4
5
6
7
8
9
10
11
12
13
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,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# -*- 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*160.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 in rule.link_extractor.extract_links(response) if not in seen]
            if links and rule.process_links:
                links = rule.process_links(links)
            for link in links:
                seen.add(link)
                = 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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号