这是我第一次进行网络爬行,我正在尝试仅对以下网站的页面(1-...)进行网络爬行:
http://jobs.monster.com/search/?q=data%20science
使用 python beautifulsoup,但似乎无法识别页面的标签。 标签看起来像这样:
<a href="?q=data-science&page=1" class="page-link">1</a>
我的部分代码如下所示:
import urlparse
import urllib
import re
from bs4 import BeautifulSoup
# start with this page
url = "http://jobs.monster.com/search/?q=data%20science"
#http://jobs.monster.com/search/?q=data%20science&page=2
# stack of urls from nytimes
urls = [url]
#print urls
# visited urls
visited = [url]
while len(urls) > 0:
try:
htmltext = urllib.urlopen(urls[0]).read()
except:
print urls[0]
soup = BeautifulSoup(htmltext)
urls.pop(0)
for tag in soup.find_all('a', {'class':'page-link'}):
print tag
我没有收到任何错误,但也没有打印任何内容...我猜测这是因为 href 不以 http/s 开头?
有人可以帮忙吗?
谢谢
最佳答案
问题是您的网站在使用 urllib
加载时不包含 page-link
类的 anchor 。
但是您在浏览器中看到它。这是因为 JavaScript 创建了指向下一个站点的页面链接。如果您使用具有良好开发工具的浏览器(我使用 Chrome),您可以禁用网站上的 JavaScript 执行。如果您执行此操作并再次加载网站,您将看到分页消失。
但是为了解决您的问题,您可以提取职位结果计数并根据该值创建 URL 列表:每个站点显示 20 个职位发布。您可以将结果计数除以 20,然后查看需要爬网的页面数。当然,这仅适用于结果低于 1000 的搜索。超过 1000 个结果,您只会显示“1000+ 结果”,因此您无法真正计算页面数量。
但是,如果您仔细查看加载的页面的源代码,您可以找到创建分页的 JavaScript 标记。这包括可用于创建要抓取的 URL 列表的页面总数。当然,这将包括一些文本解析,但如果您投入一些时间,您可以找到一种方法来完成它。
如果您有足够的页面数量,您可以创建一个循环(或生成器)并使用注释行作为下一个网址:
for p in range(2,page_count+1):
url = "http://jobs.monster.com/search/?q=data%20science&page="+str(p)
或
urls = ["http://jobs.monster.com/search/?q=data%20science&page="+str(p) for p in range(2, page_count+1)]
循环从 2 开始,因为您已经拥有第一个站点,因此无需再次加载它。
关于python - 无法使用 beautifulsoup 检索 <a> 标签 href(以 "?"而不是 http/s 开头),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33159895/