爬虫-爬取网页数据

通过Python3.8 来写爬虫代码,获取网站信息

爬虫库:requests    一般用于处理网络请求,获取html页面

requests库的session会话对象可以跨请求保持某些参数。说白了,就是使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数

在爬取页面的时候不能每一次请求就去登陆一下,这时需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求

 

# 请求参数
payload = {'key1': 'value1', 'key2': 'value2'}

# 添加请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36 Edg/89.0.774.45'
}

# requests的会话对象
sess = requests.session()

# get请求
r = requests.get("http://httpbin.org/get",params=payload, headers=headers)

# post请求
r = requests.post("http://httpbin.org/post", data=payload, headers=headers)

# put请求
r = requests.put("http://httpbin.org/put")

# delete请求
r = requests.delete("http://httpbin.org/delete")

r = requests.head("http://httpbin.org/get")

r = requests.options("http://httpbin.org/get")

  

  

Beautifulsoup库  处理整个页面的html代码,从HTML或XML文件中提取数据

Beautifulsoup中文文档:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#id14

# 选用lxml解析器来解析
soup = BeautifulSoup(html, 'lxml')

# 获取标题
print(soup.title)

# 获取文本
print(soup.title.text)

# 通过标签定位    输出数组
print(soup.find_all('a'))

# 通过属性定位    输出数组
print(soup.find_all(attrs={'id': 'link1'}))

# 标签 + 属性定位   输出数组
print(soup.find_all('a', id='link1'))

# 输出文本
print(soup.text)

 

案例:爬取博客园首页文章信息

import requests
from bs4 import BeautifulSoup
# 添加请求头
headerss = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36 Edg/89.0.774.45'
}

# 博客园的首页信息
back1 = requests.get('https://www.cnblogs.com/', headers=headerss)


# 通过Beautiful 获取html文本中的内容
def query_info(back):
    soup = BeautifulSoup(back.text)

    # 调整html文本格式
    # print(soup.prettify())

    # 在文档中找到以div为标签的数据
    # print(soup.find_all('div'))

    # 通过div标签及属性进行寻找  返回一个数组     第一次寻找
    list = soup.find_all('div', {'class': 'post-item-text'})

    print('**********************************************************')

    for query in list:
        # 通过属性进行第二次寻找
        query_title = query.find_all(attrs={'class': 'post-item-title'})
        query_text = query.find_all('p')
        print("--------------------")
        # 输出文本
        print("标题:" + query_title[0].text.replace('\n', ''))
        print("摘要:" + query_text[0].text.replace(' ', '').replace('\n', ''))
        print("--------------------")

    print('**********************************************************')


query_info(back1)

# 读取博客园的下一页操作
# 请求头
header2 = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36',
    'referer': 'https://www.cnblogs.com/'
}

# 输入参数
data1 = {
    "CategoryId": 808,
    "CategoryType": "SiteHome",
    "ItemListActionName": "AggSitePostList",
    "PageIndex": 2,
    "ParentCategoryId": 0,
    "TotalPostCount": 4000
}

# 建立一个会话
sess = requests.session()

# 访问首页,通过会话拿取cookie
sess.get('https://www.cnblogs.com/', headers=header2)

back2 = sess.post('https://www.cnblogs.com/AggSite/AggSitePostList', json=data1, headers=header2)

query_info(back2)

  

 

posted @ 2021-03-10 11:46  wangssd  阅读(828)  评论(0编辑  收藏  举报