我正在尝试打印donedeal上每个项目的标题,并复制我自己的蜘蛛中的代码,该代码在Overclockers上运行完美无缺,并相应地更改代码:
导入请求 来自bs4 import BeautifulSoup
def donedeal(max_pages):
for i in range(1, max_pages+1):
page = (i - 1) * 28
url = 'https://www.donedeal.ie/farming?sort=publishdate%20desc&start={}'.format(page) # http:/?...
source_code = requests.get(url)
plain_text = source_code.content
soup = BeautifulSoup(plain_text, "html.parser")
for title in soup("p", {"class": "card__body-title"}):
x = title.text
print(x)
donedeal(1)
页码如下:0, 28, 56..
所以我必须在功能顶部相应地更改页码。
问题是什么都没有打印,我得到退出代码0。 提前致谢。 编辑2:我试图从“< p class =”card__body-title“> Angus calves< / p>”中搜集。
答案 0 :(得分:3)
您需要在请求中指定一个不同的User-Agent,使其看起来像是一个真实的人(即headers = {'User-Agent':'Mozilla / 5.0'})。完成后,您的代码将按预期工作。
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
def donedeal(max_pages):
for i in range(1, max_pages+1):
page = (i - 1) * 28
req = Request('https://www.donedeal.ie/farming?sort=publishdate%20desc&start={}'.format(page), headers={'User-Agent': 'Mozilla/5.0'})
plain_text = urlopen(req).read()
plain_text.decode('utf-8')
soup = BeautifulSoup(plain_text, "html.parser")
for title in soup("p", {"class": "card__body-title"}):
x = title.text
print(x)
donedeal(1)
答案 1 :(得分:2)
当检查pdb中的汤(你的for循环之前的断点)时,我发现:
(Pdb++) p soup
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n\n<html><head>\n<title>410
Gone</title>\n</head><body>\n<h1>Gone</h1>\n<p>The requested
resource<br/>/farming<br/>\nis no longer available on this server and there is
no forwarding address.\nPlease remove all references to this resource.
</p>\n</body></html>\n
这可能意味着有一些防刮措施!该网站检测到您正在尝试使用python进行抓取,并将您发送到无法获取任何数据的页面。
将来,我建议使用pdb
检查代码,或者在遇到问题时打印出汤!这有助于清理发生的事情,并向您展示可用的标签
编辑:
虽然我不一定会推荐它(刮擦是针对donedeal的服务条款),但有一种方法可以解决这个问题。
如果你想生活在野外,你可以让requests
模块HTTP请求看起来像来自真实用户,而不是脚本。您可以使用以下方法执行此操作:
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
def donedeal(max_pages):
for i in range(1, max_pages+1):
page = (i - 1) * 28
url = 'https://www.donedeal.ie/farming?sort=publishdate%20desc&start={}'.format(page) # http:/?...
source_code = requests.get(url, headers=headers)
plain_text = source_code.content
soup = BeautifulSoup(plain_text, "html.parser")
for title in soup("p", {"class": "card__body-title"}):
x = title.text
print(x)
donedeal(1)
我所做的就是告诉requests
模块使用headers
中提供的标头。这使得请求看起来像是来自使用Firefox的Mac。
我对此进行了测试,看起来它打印出了你想要的标题,没有410错误! :)
有关详情,请参阅this answer