欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python网站搜索内容定向爬虫(新手向超详细)

程序员文章站 2022-06-15 21:06:26
目录功能前期准备各个模块功能代码部分代码解析getHtmlparsePageprintlist运行效果总结功能目标网站:https://www.hellohuanxuan.top/定向爬虫,只能爬取给定URL,不进行扩展爬取爬虫向搜索框提交搜索信息,爬取搜索之后的结果所需库:requests,bs4前期准备首先查看网页搜索框,随便搜索数据看看我们注意到,此时url为:可推断出执行搜索的参数为 “?s=”之后打开F12查看源代码,看到整个数据部分是在一个main标签里,如发表时间、...

功能

  • 目标网站:https://www.hellohuanxuan.top/
  • 定向爬虫,只能爬取给定URL,不进行扩展爬取
  • 爬虫向搜索框提交搜索信息,爬取搜索之后的结果
  • 所需库:requests,bs4

前期准备

  1. 首先查看网页搜索框,随便搜索数据看看
    Python网站搜索内容定向爬虫(新手向超详细)
    我们注意到,此时url为:Python网站搜索内容定向爬虫(新手向超详细)
    可推断出执行搜索的参数为 “?s=”
  2. 之后打开F12查看源代码,看到整个数据部分是在一个main标签里,如发表时间、标题,链接等等
    Python网站搜索内容定向爬虫(新手向超详细)
  3. 开始构造代码吧

各个模块功能

  • 整个爬虫分为三大模块,每个模块一个函数
  • getHtml(url, header)函数:发起请求,获得返回源代码
  • parsePage(ulist, html)函数:负责解析源代码,获取到有用的信息,并存入列表中(整个代码的关键部分)
  • printlist(ulist)函数:将列表格式化打印出来

代码部分

import requests
from bs4 import BeautifulSoup
import bs4


def getHtml(url, header):
    try:
        r = requests.get(url, headers=header)
        r.raise_for_status()
        print(r.request.headers)
        # r.encoding = r.apparent_encoding # 根据情况是否填写
        return r.text
    except:
        print("爬取失败!")
        return " "


def parsePage(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    for i in soup.find('main', {'class': 'site-main'}).children:
        try:
            if isinstance(i, bs4.element.Tag):
                psrc = i('div', {'class': 'p-time'})
                title = i('h1', {'class': 'entry-title'})
                # print(psrc[0].text)
                # print(title[0].string)
                # print(title[0].a.attrs['href'])
                ulist.append([psrc[0].text, title[0].string, title[0].a.attrs['href']])
                # ulist.append([1, 1, 1])
        except:
            print("数据丢失!")


def printlist(ulist):
    print("{:10}\t{:10}\t{:8}".format("发布日期", "标题", "链接"))
    for i in ulist:
        print("{:10}\t{:10}\t{:8}".format(i[0], i[1], i[2]))

def main():
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
    }
    worlds = '1'
    ulist = []
    url = "https://www.hellohuanxuan.top/?s=" + worlds
    html = getHtml(url, header)
    parsePage(ulist, html)
    printlist(ulist)


if __name__ == "__main__":
    main()

代码解析

getHtml

    try:
		# 通过requests的get方法获得源代码
        r = requests.get(url, headers=header)
		# 判断返回状态码是否为200,不为200直接进入异常
        r.raise_for_status()
		# 打印头部信息看看,可注释掉
        print(r.request.headers)
        # r.encoding = r.apparent_encoding # 根据情况是否填写,爬我的网站要注释,否则显示中文为乱码
        return r.text
    except:
        print("爬取失败!")
        return " "

parsePage

	# 利用BeautifulSoup解析html
    soup = BeautifulSoup(html, "html.parser")
	# for循环查找class为'site-main'的main标签的字标签
    for i in soup.find('main', {'class': 'site-main'}).children:
		# try except捕捉异常
        try:
		# isinstance函数在这里判断i是否是bs4库里规定的标签类型
            if isinstance(i, bs4.element.Tag):
				# 获取class为'p-time'的div标签
                psrc = i('div', {'class': 'p-time'})
				# 获取class为'entry-title'的h1标签
                title = i('h1', {'class': 'entry-title'})
                # print(psrc[0].text)
                # print(title[0].string)
                # print(title[0].a.attrs['href'])
				# 将值写进列表
                ulist.append([psrc[0].text, title[0].string, title[0].a.attrs['href']])
                # ulist.append([1, 1, 1])
        except:
            print("数据丢失!")

printlist

	# 格式化输出列表
    print("{:10}\t{:10}\t{:8}".format("发布日期", "标题", "链接"))
    for i in ulist:
        print("{:10}\t{:10}\t{:8}".format(i[0], i[1], i[2]))

运行效果

Python网站搜索内容定向爬虫(新手向超详细)

总结

大家千万别全拿我的网站爬啊,学生服务器经不起太多折腾。(无奈)
最后推荐一个慕课的视频,北京理工大学嵩天老师的python爬虫课程,讲的很清晰也很透彻。
Bilibili链接:python网络爬虫与信息提取
python爬虫学习中,如果大佬们看出有什么可以优化的地方欢迎指正
转自自己的小网站:我的博客

本文地址:https://blog.csdn.net/Aaaes/article/details/107647278