Python爬取infobox内容并保存为三元组

最近爬取了一些关键词的infobox,此代码中没有加入ip池,所以爬个30条左右关键词就会受到反爬限制,ip就会被封十多分钟,加入UserAgent和设置随机sleep的时间我觉得对反爬没有用。

关键词“北京”的infobox展示如下:
这是关键词“北京”的infobox
接下来是爬取代码,网址自行写入即可使用,代码内的注释中解释的比较详细了

import requests
import unicodedata
import re
from bs4 import BeautifulSoup
import bs4
from fake_useragent import UserAgent
import time
import random
#随机获取一条UA,我感觉对反爬没用^_^
# header = UserAgent().random
# agent_list = [
# 	"Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
# 	"Avant Browser/1.2.789rel1 (http://www.avantbrowser.com)",
# 	"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
# 	"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
# 	"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
# 	"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
# 	"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
# 	"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
# 	"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
# 	"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
# 	"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
# 	"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
# 	"Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
# 	"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"
# 	]

# header = {"User-Agent": random.choice(agent_list)}
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"}
def search(content):
    # content = input("输入想要查询的内容:")
    # 运行代码后键入关键词查询的话就解除引用

    url0 = "爬取的网址"

    url = url0 + content
    # 网址后加关键词到具体页面
    response = requests.get(url, headers= header)
    soup = BeautifulSoup(response.content, "html.parser")
    list0 = []
    list1 = []
    # 获取左半部分infobox内容,因为infobox是左右对称的,网页源代码稍有区别,不属于同一个class,其余一样
    info_box_left = soup.find("dl", class_="basicInfo-block")
    for dt in info_box_left.find_all("dt", class_="basicInfo-item name"):
        name = dt.get_text().strip()
        value = dt.find_next("dd", class_="basicInfo-item value").get_text().strip()
        
        value = value.replace("\n", "")
        value = re.sub(r"\[.*?\]", "", value)
        #爬取到的infobox内容有很多带注释[?]或者换行符“\n”,通通删掉
        list0.append(f"{content}%{name}%{value}")

    # 获取右半部分infobox内容
    info_box_right = soup.find("dl", class_="basicInfo-block basicInfo-right")
    for dt in info_box_right.find_all("dt", class_="basicInfo-item name"):
        name = dt.get_text().strip()
        value = dt.find_next("dd", class_="basicInfo-item value").get_text().strip()
        value = value.replace("\n", "")
        value = re.sub(r"\[.*?\]", "", value)
        list0.append(f"{content}%{name}%{value}")
        
    for i in list0: 
        list1.append(unicodedata.normalize('NFKC', i))
    print(list1)
# search("北京")
# 将下边所有代码注释掉,调用search函数,搜什么关键词会直接像我下图所示print出来。
    with open("三元组扩充.txt", "a", errors="ignore") as file:
        for item in list1:
            file.write(str(item) + "\n")
# 将列表中爬取到的三元组信息逐行加入“三元组扩充.txt”文档中
with open("关键词列表.txt", encoding = 'gbk') as f:
    for line in f:
        try:
            time.sleep(random.uniform(20, 30))
            # 这里随机设置了睡眠时间在20s-30s,结果对反反爬没有任何卵用......
            search(line.strip())
        except Exception as e:
            print(f"An error occurred with argument {line.strip()}: {e}")
            # 由于ip被封或者百度百科没有收录这个关键词,就会报错,报了就报了无所谓,下边continue会继续带你搜下一个关键词
            continue
# 我先爬取了页面中带超链接的关键词(之所以要带超链接的有这个关键词的信息),并保存进了这个“关键词列表.txt”中,这样代码会取一个关键词,然后查这个关键词,并把infobox自动保存为三元组的格式

关于unicodedata.normalize('NFKC', i),如果直接将i加入到列表,那么爬出来的infobox如下图所示,会出现很多不间断空白符:
“北京”的infobox
而使用unicodedata.normalize('NFKC', i)后,会将空白符去掉,完美的三元组信息就被提取到了:
“北京”的三元组信息
到这,网页中infobox的信息就被保存为三元组了。

在三元组列表中,分隔符为“%”,这个可以任意替换。

加入代理ip防止反爬会在之后的文章中写,记录下学习,如有错误恳请批评指正,欢迎大家讨论,互相进步。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,可以使用Python中的requests库和BeautifulSoup库来爬取瓜子二手车网站的信息,并将数据保存到csv文件中。以下是示例代码: ```python import requests from bs4 import BeautifulSoup import csv # 定义请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 定义要爬取的页面数量 page_num = 30 # 定义写入csv文件的表头 headers = ['车型', '车价', '上牌时间', '里程', '排量', '变速箱', '所在城市', '看车地址'] # 创建csv文件并写入表头 with open('guazi_cars.csv', mode='w', encoding='utf-8', newline='') as f: writer = csv.writer(f) writer.writerow(headers) # 爬取信息 for page in range(1, page_num+1): url = f'https://www.guazi.com/www/buy/o{page}/#bread' res = requests.get(url, headers=headers) soup = BeautifulSoup(res.text, 'html.parser') car_list = soup.find_all('div', class_='list-infoBox') # 解析车辆信息并写入csv文件 with open('guazi_cars.csv', mode='a', encoding='utf-8', newline='') as f: writer = csv.writer(f) for car in car_list: car_info = [] car_info.append(car.find('h2', class_='t').text.strip()) car_info.append(car.find('div', class_='t-price').text.strip()) car_info.extend([info.text.strip() for info in car.find_all('div', class_='t-i')]) writer.writerow(car_info) print(f'已爬取第{page}页信息。') print('所有信息爬取完成并保存到csv文件中。') ``` 以上代码会爬取瓜子二手车网站的前30页信息,每页20条,共计600条,并将数据保存到名为`guazi_cars.csv`的csv文件中,文件编码为utf-8。你可以根据需要修改`page_num`来控制要爬取的页数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Magneto_万磁王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值