【Python】爬虫入门强烈推荐系列四(完结篇)

在系列一中,我们重点学习了网页的基本组成与网页代码的简单分析,并且学习了requests库的实战操作。requests是python实现的最简单易用的HTTP库,因此强烈建议爬虫使用requests
系列一链接:【Python】爬虫入门强烈推荐系列一

在系列二中,我们重点学习了解析和提取 HTML 数据的三个库,分别是re,Xpath和Beautiful Soup。推荐重点学习的是正则表达式re
系列二链接:【Python】爬虫入门强烈推荐系列二

在系列三中,我们重点学习了使用代码模拟人为登录丁香园的操作,使用的库是Selenium
系列三链接:【Python】爬虫入门强烈推荐系列三

前面的三个系列帮我们实现了登录(Selenium)、提取(requests)、解析(正则表达式re)三个基本操作。接下来,我们应该着重于实战,爬取一些厉害的网站,获取我们想要的资源。

腾讯

腾讯新闻爬取50条新闻:腾讯新闻

import time
import random
from selenium import webdriver
from lxml import etree
import pandas as pd

driver=webdriver.Chrome(executable_path="/Users/lukeda/Desktop/chromedriver")
driver.get('https://news.qq.com/')

# 因为是随机滑动,所以无法控制爬取的条数
for i in range(20):
    height = random.randint(800,1000)
    driver.execute_script(f'window.scrollBy(0,{height})')
    time.sleep(random.random()+0.2) #设置滑动速度

#获取网页文本
html = driver.page_source
#提取和解析
tree = etree.HTML(html)
infos = tree.xpath('//ul[@class="list"]/li/div[@class="detail"]/h3/a')
infolist = []
count = 0

for i,info in enumerate(infos):
    title = info.xpath('text()')[0]
    href = info.xpath('@href')[0]
    infolist.append([i+1,title,href])

# 保存为csv
name = ['序号','新闻标题','新闻链接']
# 多于50条只保存前50条
try:
    df = pd.DataFrame(columns=name, data=infolist[:50])
except:
    df = pd.DataFrame(columns=name, data=infolist)

# 注意此处的编码,不设置会出现乱码
df.to_csv('腾讯新闻热点.csv',index=False,encoding='utf_8_sig')

在这里插入图片描述

百度

爬取百度文库VIP账号下载文章:无人驾驶汽车的政策困境

import requests
import re
import json
# 模拟手机登录
headers = { "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Mobile Safari/537.36"}

def get_all(url):
    response = requests.get(url, headers=headers).text
    #print(response)

    result = re.search(r'&md5sum=(.*)&sign=(.*)&rtcs_flag=(.*)&rtcs_ver=(.*?)".*rsign":"(.*?)",', response, re.M | re.I)  # 寻找参数
    reader = {"md5sum": result.group(1),
       		  "sign": result.group(2),
      		  "rtcs_flag": result.group(3),
      	 	  "rtcs_ver": result.group(4),
      		  "width": 200,	
      		  "type": "org",
      		  "rsign": result.group(5)}

    result_page = re.findall(r'merge":"(.*?)".*?"page":(.*?)}', response)  # 获取每页的标签
    doc_url = "https://wkretype.bdimg.com/retype/merge/" + url[29:-5]  # 网页的前缀
    print(doc_url)
    n = 0
    for i in range(len(result_page)):  # 最大同时一次爬取10页
        if i % 10 is 0:
            doc_range = '_'.join([k for k, v in result_page[n:i]])
            reader['pn'] = n + 1
            reader['rn'] = 10
            reader['callback'] = 'sf_edu_wenku_retype_doc_jsonp_%s_10' % (reader.get('pn'))
            reader['range'] = doc_range
            n = i
            get_page(doc_url, reader)#使用requests获取每页的内容 并且使用re提取和解析
    else:  # 剩余不足10页的
        doc_range = '_'.join([k for k, v in result_page[n:i + 1]])
        reader['pn'] = n + 1
        reader['rn'] = i - n + 1
        reader['callback'] = 'sf_edu_wenku_retype_doc_jsonp_%s_%s' % (reader.get('pn'), reader.get('rn'))
        reader['range'] = doc_range
        get_page(doc_url, reader)
        

#over~

获得html文本,然后进行提取和解析

def get_page(url, data):
    response = requests.get(url, headers=headers, params=data).text
    response = response.encode('utf-8').decode('unicode_escape')  # unciode转为utf-8 然后转为中文
    response = re.sub(r',"no_blank":true', '', response)  # 清洗数据
    result = re.findall(r'c":"(.*?)"}', response)  # 寻找文本匹配
    result = '\n'.join(result)
    print(result)

输入爬取的文库网址,即可调用上面封装好的函数

if __name__ == '__main__':
    url = "https://wenku.baidu.com/view/6717728fb9f67c1cfad6195f312b3169a551ea35"
    get_all(url)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43999137/article/details/105759316