爬虫新手入门:爬取百度新闻首页

代码来自于

https://www.yuanrenxue.com/crawler/news-crawler.html

因为完全是新手小白,看这个代码也看了很久很久…写了个分析,还是挺详细的。

一、分析网页

百度新闻网址

https://news.baidu.com/

打开后的界面
爬虫新手入门:爬取百度新闻首页_第1张图片
划红线的这些内容是我们的目标。
点开红线部分,看下代码
爬虫新手入门:爬取百度新闻首页_第2张图片
我们的目标在ul标签的li标签中的strong标签的a标签中的href里面。

二、代码解读

import re
import time
import requests
import tldextract

def save_to_db(url, html):
    # 保存网页到数据库,我们暂时用打印相关信息代替
    print('%s : %s' % (url, len(html)))

%s是占位符

抓取网页:↓
提取文本text

def crawl():
    hub_url = 'http://news.baidu.com/'
    res = requests.get(hub_url)
    html = res.text

运用正则表达式,提取里面的href

    links = re.findall(r'href=[\'"]?(.*?)[\'"\s]', html)
    print('find links:', len(links))
    news_links = []

re. findall(pattern, string[, flags])
搜索string,以列表形式返回全部能匹配的子串。

找出新闻链接,假设非百度的都是外链。

for link in links:
        if not link.startswith('http'):
            continue
        tld = tldextract.extract(link)
        if tld.domain == 'baidu':
            continue
        news_links.append(link)
    print('find news links:', len(news_links))

tldextract是顶级域名提取
如果link不是以“http”开头或者域名是“baidu”,则用continue跳过。

tld = tldextract.extract('http://news.baidu.com/')

结果是三项:
subdomain=‘news’
domain='baidu
suffix=‘com’

把所有的链接打印出来:

for link in news_links:
        html = requests.get(link).text
        save_to_db(link, html)
    print('works done!')

requests.get(link).text是导出其中的str
如果是requests.content是bytes对象,text是content里面的str对象。
要注意中文编码问题,默认编码可能有问题,可能需要cchardet来编码。

所有代码如下:

import re
import time
import requests
import tldextract

def save_to_db(url, html):
    # 保存网页到数据库,我们暂时用打印相关信息代替
    print('%s : %s' % (url, len(html)))

def crawl():
    # 1. download baidu news
    hub_url = 'http://news.baidu.com/'
    res = requests.get(hub_url)
    html = res.text

    # 2. extract news links
    ## 2.1 extract all links with 'href'
    links = re.findall(r'href=[\'"]?(.*?)[\'"\s]', html)
    print('find links:', len(links))
    news_links = []
    ## 2.2 filter non-news link
    for link in links:
        if not link.startswith('http'):
            continue
        tld = tldextract.extract(link)
        if tld.domain == 'baidu':
            continue
        news_links.append(link)

    print('find news links:', len(news_links))
    # 3. download news and save to database
    for link in news_links:
        html = requests.get(link).text
        save_to_db(link, html)
    print('works done!')

def main():
    while 1:
        crawl()
        time.sleep(300)

if __name__ == '__main__':
    main()

你可能感兴趣的:(python爬虫入门)