python网络爬虫(新手第二篇)

那我们从简单的爬虫开始入手
先介绍数据库,我们从urllib这个库开始说起
urllib这个库是python内置的HTTP请求库,包含request/error/parse/robotparser四个模块
我们要使用到request中的urlopen()方法,它可以实现最基础的请求发起。
而urlopen()中有很多参数,其中要爬取的网站的url不可以省略,而其他参数均可省略。
不过现在可以使用requests库来替代urllib库,所以下面仅用urllib实现一次简单的爬虫。

import urllib

url="https://www.baidu.com"
html1=urllib.request.urlopen(url).read()
print(html1)

这就可以爬取百度首页的网页源代码,当然那并不是我们想要的信息,所以我们将进一步学习,得到我们想要爬取的内容。

接下来我们使用一个功能更加强大的库——requests
我们将使用requests中的get()方法来实现发起请求,然后要讲到如何模拟浏览器来避过网页的反爬虫检测。
这就要讲到,get()方法的一个参数headers,我们可以找到最近浏览器的headers,将其放入get()方法中即可
那我们先写一个同样是爬取百度首页的爬虫

import requests

url="http://www.baidu.com/"
headers={'User-Agent':' Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2767.400'}

html=requests.get(url,headers=headers).text
print(html)

以下就是爬取出来的网页源代码
百度首页源代码

这样子同样得到了百度首页的源代码,那么下面我将写到如何对网页信息做出筛选,即解析网页。
解析网页我们可以用到re这个库,通过正则表达式来匹配我们需要的内容
我们拿豆瓣电影排名作为例子

1.先打开豆瓣网排名 https://movie.douban.com/top250
豆瓣排名

我们查看网页源代码
网页源代码

然后再到我们需要的电影名称开始的地方

可以看到排在第一的电影名出现了,我们往下看可以发现其他的电影名也是处在同样的结构中。
于是可以用正则表达式进行匹配

下面先列举一些正则表达式的表示方法以及模式:
\w 匹配字母,数字,下划线
\s 匹配任意空白字符
\d 匹配任意数字
以上字母大写则代表 不匹配对应的字符

. 匹配除了换行符的任意字符
[… ] 表示一组字符,例如[abc]匹配a,b,c这三种字符
[^…] 表示不匹配[ ]中的字符,例如[^xyz]即为不匹配x,y,z这三种字符
*匹配零次或多次
+匹配一次或多次
?非贪婪模式
{n}精确匹配n个需要匹配的表达式
x|y 匹配x或y

然后还有几个相关的函数
(1)match()
该函数从字符串起始位置开始匹配,需要两个参数,第一个是正则表达式,第二个是需要匹配的文本
(2)search()
该函数扫描整个字符串,然后返回第一个匹配成功的内容
(3)findall()
该函数则是将所有匹配成功的内容以列表的形式返回

2.我们可以写出爬取的代码了

import requests
import re

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6776.400 QQBrowser/10.3.2577.400'}
url='https://movie.douban.com/top250'
file=requests.get(url,headers=headers,timeout=10)
titlelist=re.findall('<span class="title">(.*?)" </span>',file.text)
print(titlelist)

我们可以看到运行结果
爬取结果

但是并不够250个,那是因为还需要翻页才看得到下面的,当我们点击了下一页后就会发现网址多了一个参数,所以页面变化的网址是有规律的
于是可以写出一个优化的程序
并且将排名保存下来

import requests
import re

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6776.400 QQBrowser/10.3.2577.400'}

url='https://movie.douban.com/top250?start='
j=1
for i in range(0,11):
    url_=url+str(i*25)
    file=requests.get(url_,headers=headers,timeout=10)
    titlelist=re.findall('<span class="title">(.*?)" </span>',file.text)
    print(titlelist)

    try:
        with open('movie_top250.text','a+') as f:
            for title in titlelist:
                f.write(str(j)+'.'+title+'\n')
                j+=1
            f.close()
    except:
        print('写入文件失败')

打开保存下来的文件(部分排名,未显示完):
在这里插入图片描述

这是简单的静态网页爬取
之后会学到动态网页爬取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值