This my first time web crawling and I am trying to web crawl, only the pages (1-...), of the following website:
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开头的?
有人可以帮忙吗?
由于
答案 0 :(得分:2)
问题是,当您的网站加载page-link
时,您的网站不包含类urllib
的锚点。
但是你在浏览器中看到它。这是因为JavaScript会创建指向下一个站点的页面链接。如果您使用具有良好开发者工具的浏览器(我使用Chrome),您可以在网站上禁用JavaScript执行。如果你这样做并再次加载网站,你会看到分页消失。
但是要解决您的问题,您可以提取作业结果计数并根据此值创建URL列表:每个站点显示20个作业发布。您可以将结果计数除以20,并查看您需要抓取的页数。当然,这仅适用于结果低于1000的搜索。超过1000个结果只能获得&#34; 1000+个结果&#34;显示,因此您无法真正计算页数。
但是,如果仔细查看加载页面的源代码,可以找到创建分页的JavaScript标记。这包括您可以用来创建要删除的URL列表的总页数。当然,这将包括一些文本解析,但如果你花一些时间,你可以找到一种方法如何去做。
如果你有足够多的页面,你可以创建一个循环(或生成器)并使用你的注释行作为下一个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开始,因为您已经拥有了第一个站点,因此无需再次加载它。
答案 1 :(得分:0)
感谢GHajba的详细解释!
这或多或少是我最终做的事情:
try:
for i in range(2, 100):
page = urlparse.urljoin(mainUrl, "?q=data%20science&page=" + str(i))
readPage = urllib.urlopen(page).read()
soup = BeautifulSoup(readPage)
except:
pass
谢谢大家!