Python:有条件地在抓取过程中跳过url

Posted

技术标签:

【中文标题】Python:有条件地在抓取过程中跳过url【英文标题】:Python: Skip url in scraping process conditionally 【发布时间】:2017-03-23 19:00:00 【问题描述】:

我正在通过 BS4 抓取房地产广告,使用以下代码,

# get_ad_page_urls collects all ad urls displayed on page
def get_ad_page_urls(link): 
    BS4_main(link) # BS4_main parses the link and returns the "container" object
    return [link.get("href") for link in container.findAll("a", href=re.compile("^(/inmueble/)((?!:).)*$"))]

# get_ad_data obtains data from each ad
def get_ad_data(ad_page_url):
    ad_data=
    response=requests.get(root_url+ad_page_url)
    soup = bs4.BeautifulSoup(response.content, 'lxml')

    <collecting data code here>

    return ad_data

这很好用。通过下面的多处理代码,我抓取了所有的广告,

def show_ad_data(options):
    pool=Pool(options)
    for link in page_link_list:
        ad_page_urls = get_ad_page_urls(link)
        results=pool.map(get_ad_data, ad_page_urls)    

现在的问题:

应跳过特定广告。这些广告显示特定的文字,通过这些文字可以识别它们。我是使用def 函数的新手,我不知道如何告诉代码跳到下一个ad_page_url

我认为“跳过”代码应该放在soup = bs4.BeautifulSoup(response.content, 'lxml')&lt;collecting data code here&gt; 之间。类似的,

# "skipping" semi-code
for text in soup:
    if 'specific text' in text:
        continue

但我不确定使用def 函数是否允许应用continue 关于迭代。

specific 文字出现在页面上时,我应该如何修改代码以跳过广告?

【问题讨论】:

您所称的 def 函数实际上只是在您调用所述函数时运行的代码块,所以是的,如果您在 for 循环中运行 continue ,它将简单地转到下一次迭代并继续。停止整个函数的唯一方法是使用某种 sys.exit() 或 return 函数调用以从“def 函数”中返回 【参考方案1】:

是的,如果在 if 语句中满足跳过条件,则 continue 或 pass 将继续进行下一次迭代跳过:

def get_ad_data(ad_page_url):
    ad_data=
    response=requests.get(root_url+ad_page_url)
    soup = bs4.BeautifulSoup(response.content, 'lxml')

    for text in soup:
    if 'specific text' in text:
        continue #or pass
    else:
        <collecting data code here>

    return ad_data

【讨论】:

以上是关于Python:有条件地在抓取过程中跳过url的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫是啥?

[Python爬虫] 之十:Selenium +phantomjs抓取活动行中会议活动(多线程抓取)

如何根据某些条件在 MSSQL 游标中跳过一行(迭代)?

Java中做网络抓取demo用的Jsoup进行url解析如果链接中带中文就会出现乱码

Python爬虫实战四之抓取淘宝MM照片

芝麻HTTP:Python爬虫实战之抓取淘宝MM照片