python爬虫实战之翻页爬取糗事百科段子

近期在翻看视频学习爬虫,把每天学习的内容记录下~如有一起学习的爬友就更好了。

简单基础

1、正则表达式

用途:用于信息筛选提取
1、全局匹配函数使用格式:
re.compole(‘正则表达式’).findall(‘源字符串’)
普通字符abc 正常匹配-abc 原子
\w 匹配字母、数字、下划线 原子
\W 匹配除字母、数字、下划线 原子
\d 匹配十进制数字 原子
\D 匹配除十进制数字 原子
\s 匹配空白字符 原子
\S 匹配除空白字符 原子
[ab89x] 原子表,匹配[]内的ab89x中的任意一个
[^ab89x] 原子表,匹配除ab89以外的任意一个字符

2、字符匹配
. 匹配除换行外任意一个字符
^ 匹配开始位置
$ 匹配结束位置
* 前一个字符出现任意次(0,1,或多次)
? 前一个字符出现最多1次(0,1)
+ 前一个字符出现最少一次(1,多次)
{n} 前一个字符出现n次
{n,} 前一次字符出现最少n次
{n,m} 前一个字符出现n~m次
| 模式选择符或
() 模式单元:想提取出什么内容,就在正则中用小括号括起来

3、贪婪模式&懒惰模式
贪婪模式:尽可能多的匹配(默认模式)
懒惰模式:尽可能少的匹配
*? +?

4、模式修正符,在不改变正则表达式的情况下,通过模式修正符使匹配结果发生改变
re.S 让.也可以匹配多行
re.I 匹配时忽略大小写

2、信息筛选工具

正则表达式、xpath表达式、Beautiful soup…
XPath:
/ 逐层提取
text() 提取标签下面的文本
//标签名** 提取所有名为**的标签
//标签名[@属性=‘属性值’] 提取属性为XX的标签
@属性名 取某个属性值

urllib基础

需要导入的模块:
import urllib
import urllib.request

  1. 将内容爬到内存中
url = 'http://www.jd.com'
data = urllib.request.urlopen(url).read().decode('utf-8', 'ignore')
print(len(data))
  1. 将内容爬到硬盘的文件中
urllib.request.urlretrieve(url, filename = 'D:\\software\\sublime\\python-workspace\\practice\\base\\jd.html')
  1. 用户代理:打开一个网页,f12
    在这里插入图片描述
    User-Agent:用户代理,标识浏览器访问
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
  2. 浏览器伪装:先伪装opener,再伪装urlopen
url = 'https://www.qiushibaike.com'
opener = urllib.request.build_opener()
UA = ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36')
opener.addheaders = [UA]

将伪装好的opener安装为全局

urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read().decode('utf-8', 'ignore')
print(len(data))
  1. 用户代理池
    如果用同一个浏览器频繁访问某网站,可能会被认为是爬虫,用多个浏览器标识访问
import random
url = 'https://www.qiushibaike.com'
userpools = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363',
'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko']
def UA():
    opener = urllib.request.build_opener()
    thisua = random.choice(userpools)
    ua = ('User-Agent', thisua)
    opener.addheaders = [ua]
    urllib.request.install_opener(opener)
    print('当前使用的UA:', thisua)
for i in range(0,10):
    UA()
    data = urllib.request.urlopen(url).read().decode('utf-8', 'ignore')
    print(len(data))

实战

目标站点:https://www.qiushibaike.com
目标数据:热门段子
要求:实现自动翻页
分析:
1)取段子数据:ctl+u查看网页源码,ctl+f(搜索),找标签,span太多(不一定能找到,不能精确筛选),找出段子数和标签数匹配的标签
在这里插入图片描述
2)翻页:
观察网址的变化:
第一页:https://www.qiushibaike.com/text/
第二页:https://www.qiushibaike.com/text/page/2/
第三页:https://www.qiushibaike.com/text/page/3/
。。。
第10页:https://www.qiushibaike.com/text/page/10/
猜测第一页是否:https://www.qiushibaike.com/text/page/1/可以访问—可以

import urllib
import urllib.request
import random
import re

url = 'https://www.qiushibaike.com'
userpools = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363',
'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko']

def UA():
    opener = urllib.request.build_opener()
    thisua = random.choice(userpools)
    ua = ('User-Agent', thisua)
    opener.addheaders = [ua]
    urllib.request.install_opener(opener)
    print('当前使用的UA:', thisua)

'''
第一页:https://www.qiushibaike.com/text/
第二页:https://www.qiushibaike.com/text/page/2/
第三页:https://www.qiushibaike.com/text/page/3/
...
第10页:https://www.qiushibaike.com/text/page/10/
'''
for i in range(1, 10):
    url = 'https://www.qiushibaike.com/text/page/%s/' % i
    UA()
    try:
        data = urllib.request.urlopen(url).read().decode('utf-8', 'ignore')
        pat = '<div class="content">.*?<span>(.*?)</span>.*?</div>'
        duanzi = re.compile(pat, re.S).findall(data)
        print(url)
        for j in range(0, len(duanzi)):
            print(duanzi[j])
            print('**************************************************')
    except Exception as err:
        pass
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值