我写了一个简单的webcrawler,它最终将只关注新闻链接,将文章文本刮到数据库中。我在跟踪源url的链接时遇到问题。以下是目前为止的代码:
import urlparse
import mechanize
url ="https://news.google.co.uk"
def spider(root, steps):
urls = [root]
visited =[root]
counter = 0
while counter < steps:
step_url = scrape(urls)
urls = []
for u in step_url:
if u not in visited:
urls.append(u)
visited.append(u)
counter+=1
return visited
def scrape(root):
result_urls = []
br = Browser()
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Chrome')]
for url in root:
try:
br.open(url)
keyWords = ['news','article','business', 'world']
for link in br.links():
newurl = urlparse.urljoin(link.base_url,link.url)
result_urls.append(newurl)
[newslinks for newslinks in result_urls if newslinks in keyWords]
print newslinks
except:
print "scrape error"
return result_urls
print spider(url, 2)
在编辑:NLTK在
^{pr2}$然后添加到数据库之后。在
Mechanize不是实现所需内容的最佳工具,这将获取所有链接并使用BeautifulSoup从链接页面中提取主文本,我们可以使用dict在正确的css选择器和网站名称之间创建一个映射,使用regex从链接中提取键并传递正确的css以进行选择:
这是从《每日电讯报》(telegraph)、《每日邮报》(dailymail)、《英国广播公司》(bbc)和《独立报》(independent)链接上的所有文章的正文。如果一个标签可以得到你想要的所有数据,你就必须为其他页面添加更多潜在的选择器,或者在html发生变化时调整它们。在
输出片段:
^{pr2}$当然,您可以
p = [p.text for p in soup.select("p")]
从段落中选择所有文本,但这将包含大量您不需要的数据。如果您只对某些页面感兴趣,您还可以根据是否在css_d
dict中找到匹配项进行筛选,方法如下:正如评论中所讨论的,对于灵活性来说,lxml是一个很好的工具,为了获得这些部分,我们可以使用以下代码:
因此,如果我们运行上面的代码,我们会得到每个部分的所有链接,下面是每个部分的一个非常小的片段,实际上返回了大量的链接:
如果我们只返回一个set get_section_链接,我们可以将其传递给函数来解析文本:
因此,使用lxml来使用xpaths进行解析,对于我们已经解析过的几个站点,我们可以添加更多的逻辑来捕捉变化:
同样,你将不得不决定哪些站点可以点击,并找到正确的xpath来获取主要文章的文本,但这会让你走得很好。当我有更多时间时,我将添加一些逻辑来异步运行请求。在
相关问题 更多 >
编程相关推荐