网络抓取中 'headers = headers' 的问题

problem with 'headers = headers' in web crawling

我正在练习我的网络爬行以从网站获取文本,但我的 'headers = headers' 有问题。当我是 运行 .py 时,它 returns 像这样:

AttributeError: 'set' object has no attribute 'items'

我的代码如下:

import requests
import time
import re


headers = {'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}

f = open('/Users/pgao/Desktop/doupo.rtf','a+')

def get_info(url):
    res = requests.get(url, headers = headers)
    if res.status_code == 200:
        contents = re.findall('<p>(.*?)</p>', res.content.decode('utf-8'),re.S)
        for content in contents:
            f.write(content+'\n')
    else:
        pass

if __name__ == '__main__':
    urls = ['http://www.doupoxs.com/doupocangqiong/{}.html'.format(str(i)) for i in range(2,10)]
    for url in urls:
        get_info(url)
        time.sleep(1)

f.close()

我正在为使用 'headers = headers' 的原因而苦苦思索,因为有时候网络抓取不需要它,但有时它需要。我用谷歌搜索的结果没有多大帮助。

header 需要是 dict,但您创建了 set。语法相似,但请注意以下内容如何有一个 key:value 对

header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}

来自 docsheaders 对于 requests.get() 必须是 dict

If you’d like to add HTTP headers to a request, simply pass in a dict to the headers parameter.

您已经通过了 set。集合没有任何 items() 方法。这就是为什么你得到这个 AttributeError.

headers = {'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}

print(type(headers))
# <class 'set'>

为您的 headers 变量添加一个键。

headers = {'User-Agent': 'Mozilla/5.0 .....'}

编辑:更新了 "User-Agent" header.

的键值