【问题标题】:Web crawler page iteration网络爬虫页面迭代
【发布时间】:2017-01-19 18:36:37
【问题描述】:

我已经编写了此代码,该代码将发送到 webMD,并且到目前为止从留言板中的每个子类别中提取了所有链接。接下来我要做的是让程序遍历子类别链接的所有页面。我尝试了很多东西,但我总是遇到问题,有什么想法吗?

import bs4 as bs
import urllib.request
import pandas as pd


source = urllib.request.urlopen('https://messageboards.webmd.com/').read()

soup = bs.BeautifulSoup(source,'lxml')


df = pd.DataFrame(columns = ['link'],data=[url.a.get('href') for url in soup.find_all('div',class_="link")])
lists=[]
for i in range(0,33):
    link = (df.link.iloc[i])
    source1 = urllib.request.urlopen(link).read()
    soup1 = bs.BeautifulSoup(source1,'lxml')

【问题讨论】:

  • 您面临的问题是什么?你检查过scrapy吗?
  • 问题是当我转到子链接的第一页时,我不知道如何继续其他页面。
  • 当您访问第一个子链接页面时,您将不得不再次阅读源代码并提取您正在寻找的信息,无论是进一步的链接还是帖子。 scrapy.org 似乎是您正在寻找的。​​span>
  • 我虽然是这样,但它必须是一种更简单的方法。这样做你需要有很多 for 循环
  • @Data1234 你现在解决这个问题了吗?

标签: python web-scraping web-crawler


【解决方案1】:

我过去曾使用 Python 和 Wget 完成类似的任务。 See Wget documentation here。您可以查看源代码以了解其工作原理。

基本上您可以执行以下操作。请参阅以下伪代码

alreadyDownloadedUrls = []
currentPageUrls = []

def pageDownloader('url'):
    downaload the given URL
    append the url to 'alreadyDownloadedUrls' list
    return the given URL

def urlFinder('inputPage'): 
    finds and returns all the URL of the input page in a list

def urlFilter ('inputUrl or list of URLs'):
    check if the input list of URLs are already in the 'alreadyDownloadedUrls' list, 
    if not appends that URL to a local list variable and returns

def controlFunction(firstPage):
    Download the first page
    firstPageDownload = pageDownloader(firstPage)
    foundUrls = urlFinder (firstPageDownload)
    validUrls = urlFilter(foundUrls)
    currentlyWorkingList = []
    for ( the length of validUrls):
         downloadUrl = pageDownloader(aUrl from the list)
         append to currentlyWorkingList
    for (the lenght of currentlyWorkingList):
        call controlFunction() recursively

但是,recursively 调用将导致您下载整个互联网。 因此,您必须验证 URL 并查看它是来自父域还是子域。您可以在 urlFilterFunction 中执行此操作。

您还必须添加更多验证,以检查您下载的链接是否在 URL 末尾带有井号标签。除非您的程序认为 thisthis URL 指向不同的页面。

你也可以像 Wget 一样引入深度限制

希望这能让你明白这一点。

【讨论】:

    最近更新 更多