10 按时间顺序爬取及批量爬取多页内容

按时间顺序爬取百度新闻

按时间排列顺序:rtt=4
按热点排列:rtt=1
具体的网页改变都会使得对应的网页链接进行变化,所有我们只需要修改url即可了。

import requests
import re
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}

def baidu(company):
    url = 'https://www.baidu.com/s?tn=news&rtt=4&bsst=1&cl=2&wd=' + company  # 把rtt参数换成4即是按时间排序,默认为1按焦点排序
    res = requests.get(url, headers=headers).text
    # print(res)

    p_href = '<h3 class="news-title_1YtI1"><a href="(.*?)"'
    href = re.findall(p_href, res, re.S)
    p_title = '<h3 class="news-title_1YtI1">.*?>(.*?)</a>'
    title = re.findall(p_title, res, re.S)
    p_date = '<span class="c-color-gray2 c-font-normal">(.*?)</span>'
    date = re.findall(p_date, res)
    p_source = '<span class="c-color-gray c-font-normal c-gap-right">(.*?)</span>'
    source = re.findall(p_source, res)

    for i in range(len(title)):  
        title[i] = title[i].strip()  # strip()函数用来取消字符串两端的换行或者空格
        title[i] = re.sub('<.*?>', '', title[i])  # 用re.sub()函数来替换不重要的内容
        print(str(i + 1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')')
        print(href[i])


companys = ['华能信托', '阿里巴巴', '百度', '腾讯', '京东']
for i in companys:  # 这个i只是个代号,可以换成其他内容
    baidu(i)
    print(i + '爬取成功')

一次性爬取多页内容

爬取一家公司的多页信息

其实与修改按时间爬取类似,都是修改网页链接。

这是第二页:
https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&rsv_dl=ns_pc&word=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4&x_bfe_rqs=03E80&x_bfe_tjscore=0.100000&tngroupname=organic_news&newVideo=12&goods_entry_switch=1&pn=10
这是第五页:
https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&rsv_dl=ns_pc&word=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4&x_bfe_rqs=03E80&x_bfe_tjscore=0.100000&tngroupname=organic_news&newVideo=12&goods_entry_switch=1&pn=40

我们能发现只是&pn=xx变化,其余的不变,根据这个规律进行修改。

import requests
import re
import time
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}

# 爬取一个公司的多页
def baidu(page):
    num = (page - 1) * 10  # 参数规律是(页数-1)*10
    url = 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&rsv_dl=ns_pc&word=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4&x_bfe_rqs=03E80&x_bfe_tjscore=0.100000&tngroupname=organic_news&newVideo=12&goods_entry_switch=1&pn=' + str(num)
    res = requests.get(url, headers=headers).text
    # 其他相关爬虫代码

    p_href = '<h3 class="news-title_1YtI1"><a href="(.*?)"'
    href = re.findall(p_href, res, re.S)
    p_title = '<h3 class="news-title_1YtI1">.*?>(.*?)</a>'
    title = re.findall(p_title, res, re.S)
    p_date = '<span class="c-color-gray2 c-font-normal">(.*?)</span>'
    date = re.findall(p_date, res)
    p_source = '<span class="c-color-gray c-font-normal c-gap-right">(.*?)</span>'
    source = re.findall(p_source, res)

    for i in range(len(title)): 
        title[i] = title[i].strip()  # strip()函数用来取消字符串两端的换行或者空格
        title[i] = re.sub('<.*?>', '', title[i])  # 用re.sub()函数来替换不重要的内容
        print(str(i + 1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')')
        print(href[i])


for i in range(10):  # 这里一共爬取了10页
    baidu(i+1)  # i是从0开始的序号,所以要写成i+1表示第几页
    print('第' + str(i+1) + '页爬取成功')  # i是从0开始的序号,所以写i+1
    time.sleep(10)  # 不要爬太快,爬太快会被反爬

爬取多家公司的多页信息

非常简单,在原先的基础上再写一个循环即可

companys = ['阿里巴巴', '百度', '腾讯', '京东']
for company in companys:
    for i in range(10):  # 这里一共爬取了10页
        baidu(company, i+1)  # i是从0开始的序号,所以要写成i+1表示第几页
        print(company + '第' + str(i+1) + '页爬取成功')  # i是从0开始的序号,所以写i+1
        time.sleep(3)  # 不要爬太快,爬太快会被反爬

补充知识点:访问超时设置——timeout参数的使用

有时访问一个网址,可能等待很久都没有反应,程序会一直等待变成假死。为避免我们需要设置访问超时
非常简单只需要加一个:

res = requests.get(url, headers=headers, timeout=10).text

当超过10s没有响应就会停止访问并报出异常,我们用try/except来处理即可

爬取同一网站多页据的方法和爬取静态网页多页据的方法类似。我们可以使用 Python 的 requests 和 BeautifulSoup 库。 首先,我们需要确定要爬取的页面的 URL 格式。假设我们要爬取的页面是 https://example.com/page?page_number=1,其中 page_number 表示页码,我们需要从第一页开始爬取,一直爬取到最后一页。 接下来,我们可以使用 requests 库获取网页的 HTML 内容,然后使用 BeautifulSoup 库解析出我们需要的内容。 具体的爬取代码可以如下: ```python import requests from bs4 import BeautifulSoup # 定义要爬取的页面 URL 格式 url_template = 'https://example.com/page?page_number={}' # 定义要爬取页码范围 start_page = 1 end_page = 10 # 循环爬取每一页 for page_number in range(start_page, end_page + 1): # 构造当前页的 URL url = url_template.format(page_number) # 发送请求获取页面内容 response = requests.get(url) # 解析页面内容 soup = BeautifulSoup(response.text, 'html.parser') # 提取我们需要的内容 # TODO: 这里根据实际情况进行提取 ``` 在这个代码中,我们首先定义了要爬取的页面 URL 格式,然后定义了要爬取页码范围。接下来,我们使用循环依次爬取每一页的内容,具体流程是: 1. 构造当前页的 URL,使用 `url_template.format(page_number)` 来替换 URL 中的占位符 `{}`,得到当前页的 URL。 2. 发送请求获取页面内容,使用 `requests.get(url)` 发送 GET 请求,得到响应对象。 3. 解析页面内容,使用 `BeautifulSoup(response.text, 'html.parser')` 将 HTML 内容解析为 BeautifulSoup 对象。 4. 提取我们需要的内容,使用 BeautifulSoup 提供的各种方法提取我们需要的内容。 需要注意的是,每个网站的页面 HTML 结构都不同,因此在提取内容时需要根据实际情况进行调整。另外,有些网站可能会对爬虫进行限制,需要加上一些反爬虫措施,比如设置请求头、使用代理等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都鼓捣的小yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值