目录

  • 功能
  • 前期准备
  • 各个模块功能
  • 代码部分
  • 代码解析
  • getHtml
  • parsePage
  • printlist
  • 运行效果
  • 总结


功能

  • 定向爬虫,只能爬取给定URL,不进行扩展爬取
  • 爬虫向搜索框提交搜索信息,爬取搜索之后的结果
  • 所需库:requests,bs4

前期准备

  1. 首先查看网页搜索框,随便搜索数据看看

    我们注意到,此时url为:
    可推断出执行搜索的参数为 “?s=”
  2. 之后打开F12查看源代码,看到整个数据部分是在一个main标签里,如发表时间、标题,链接等等
  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全网爬虫指定内容_html

总结