python正则表达式:
正则表达式是一个特殊的字符串序列,可以方便的检测字符串是否与某种模式匹配!
1. re.match() 函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回None
语法: re.match(pattern, string, falgs=0)
示例:
import re
print(re.match('www', 'www.xiaomi.com').span()) # 在起始位置匹配
print(re.match('com', 'www.xiaomi.com')) # 不在起始位置匹配
2. re.search() 函数
re.search 扫描整个字符串,并返回第一个成功匹配的值
语法:re.search(pattern, string, falgs=0)
示例:
import re
print(re.match('www', 'www.xiaomi.com').span()) # 在起始位置匹配
print(re.match('com', 'www.xiaomi.com').span()) # 不在起始位置匹配
学习任务:结合requests、re两者的内容爬取豆瓣电影 Top 250里的内容:要求抓取名次、影片名称、国家、导演等字段。
思路分析:首先找到豆瓣top250的网址:https://movie.douban.com/top250
通过手动翻页浏览,发现如下规律:
https://movie.douban.com/top250?start=0&filter= # 第一页内容
https://movie.douban.com/top250 # 第一页这个也可以
https://movie.douban.com/top250?start=25&filter= # 第二页内容
https://movie.douban.com/top250?start=50&filter= # 第三页内容
https://movie.douban.com/top250?start=75&filter= # 第四页内容
因此我们只需要更改 start=
后面的数字即可构造出10页的网址
因为我们 只要 名次、影片名称、国家、导演等字段,因为详细页的信息更丰富,本次爬虫在详细页中进行,因此先需要爬取进入详细页的网址链接,进而爬取数据
爬虫代码如下:
import requests
from lxml import etree
import re
import time
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/71.0.3578.98 Safari/537.36' # 加入请求头
}
def get_movie_url(url):
"""
获取详细页URL的函数
:param url:
:return:
"""
html = requests.get(url, headers=headers)
selector = etree.HTML(html.text)
movie_hrefs = selector.xpath('//div[@class="hd"]/a/@href')
for movie_href in movie_hrefs:
get_movie_info(movie_href)
def get_movie_info(url):
"""
获取详细页信息的函数
:param url:
:return:
"""
html = requests.get(url, headers=headers)
selector = etree.HTML(html.text)
try:
ranking = selector.xpath('//*[@id="content"]/div[1]/span[1]/text()')[0] # 排名
name = selector.xpath('//*[@id="content"]/h1/span[1]/text()')[0] # 电影名称
country = re.findall('<span class="pl">制片国家/地区:</span>(.*?)<br/>', html.text, re.S)[0] # 国家
actor = selector.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0] # 导演
print(ranking + ' ' + name + ' ' + country + ' ' + ' ' + actor)
except IndexError:
pass
if __name__ == '__main__':
urls = ['https://movie.douban.com/top250?start=%s&filter=' % i for i in range(0, 250, 25)]
for url in urls:
get_movie_url(url)
time.sleep(3)