鱼C论坛

 找回密码
 立即注册
查看: 1638|回复: 1

关于爬取百度百科“猪八戒”词条及副标题的完整代码及注解

[复制链接]
发表于 2022-4-11 09:09:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import urllib.request
import urllib.parse
import re
from bs4 import BeautifulSoup

def main():

    keyword = input('请输入检索关键词:') # 例如:王新衡
    param = urllib.parse.urlencode({'word':keyword}) # 将用户输入的关键词传入并编译后赋值给param
    print(param) # word=%E7%8E%8B%E6%96%B0%E8%A1%A1

    url = 'https://baike.baidu.com/search/word?%s' % param # 将param传入url
    print(url) # https://baike.baidu.com/search/w ... B%E6%96%B0%E8%A1%A1
    url = 'https://baike.baidu.com/item/%s' % param[5:] # [5:]表示不要前5个字符,从第6个字符开始,即%E7%8E%8B%E6%96%B0%E8%A1%A1,传入url后为https://baike.baidu.com/item/%E7%8E%8B%E6%96%B0%E8%A1%A1
    print(url) # https://baike.baidu.com/item/%E7%8E%8B%E6%96%B0%E8%A1%A1

    #headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} # 可否隐藏headers???

    req = urllib.request.Request(url) # 把目标字符串转换成Request对象req
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36') # 通过.add_header()方法修改/隐藏User-Agent
    print(req.headers) # 查看隐藏后的headers
    response = urllib.request.urlopen(req) # 将Request对象req传给urlopen函数
    html = response.read().decode('utf-8') # 用.read()方法读取urlopen返回的类文件对象的内容,其中.decode('utf-8')可不需要?
    soup = BeautifulSoup(html, 'html.parser') # 用BeautifulSoup模块(python库)指定解析器解析HTML或XML文件
   
    for each in soup.find_all(href = re.compile('item'))[10:-1]: # 迭代执行用re.compile正则表达式匹配包含item的字符串如<a target="_blank" href="/item/%E5%86%85%E9%98%81%E6%80%BB%E7%90%86%E5%A4%A7%E8%87%A3/4979386" data-lemmaid="4979386">内阁总理大臣</a>,不要前10条(从第11条开始)以及不要最后一条
        content = ''.join([each.text]) # 将词条名赋值给content?为何必须采用.join()方法?join字符串需要引号而词条名带引号?text从何而来?
        #print(content) # 打印所有带view的词条名
        url2 = ''.join(['http://baike.baidu.com', each['href'] if "%" in each['href'] else urllib.parse.quote(each['href'])]) # 判断each['href']中有无%(是否有进行了url编码),没有的话通过urllib.parse.quote话对它进行编码,然后将两部分拼接成词条名的完整网址并赋值给url2
        req2 = urllib.request.Request(url2) # 把目标字符串转换成Request对象req2
        response2 = urllib.request.urlopen(req2) # 将Request对象req2传给urlopen函数
        html2 = response2.read().decode('utf-8') # 用.read()方法读取urlopen返回的类文件对象的内容,其中.decode('utf-8')可不需要?
        soup2 = BeautifulSoup(html2, 'html.parser') # 用BeautifulSoup模块(python库)指定解析器解析HTML或XML文件
        if soup2.h2: # 判断是否存在副标题,若存在,则执行下面的语句,若不存在,则跳过下面的语句继续执行
            content = ''.join([content, soup2.h2.text]) # 将词条名与副标题两部分拼接并赋值给content,副标题括号从何而来?
            #print(content) # 打印所有带副标题的词条名及其副标题,为何不带副标题的也打印?
        content = ''.join([content, ' -> ', url2]) # 将三部分按照content -> 链接的格式拼接
        print(content) # 打印输出
        

if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-15 13:15:39 | 显示全部楼层
同样代码为何爬取“元宇宙”却返回错误?有大神指点下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 08:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表