写在前面
- 最近公司开始流行分享技术,之前在公司也做过这件事,后来工作比较忙搁置了,现在不是那么忙,业余时间自己瞎研究,都说Python是未来的大方向,你我都是同龄人,岂能落于他人后! 人生苦短我用Python主要是快拿来主义,不需要什么都明白,会用就好。今天也是同样的道理,我会尽量用简单、易懂的方式阐述一下我的这个实战案例!
直奔干货
- 网络爬虫的步骤
1.分析站点
2.找到真实的数据源
3.建立请求获取想要的数据
4.分析下一页地址,找出规律,实现多页请求
开发环境
- 系统 :macOS
- 工具: PyCharm
- Python3.6
- 存储库:MongoDB
首页我们看一下完成的结果
2.png 3.png流程
-
第一步 分析第一页的网页 url = http://maoyan.com/board/4?offset=0
1.png
网页源代码.png
结果:很开心在网页源代码中我们看到了我们想要的数据 -
第二步数据就是我们每一个dd标签中的信息,在这里我们就采集img_url,title,actor,time 这四个数据
-
第三步开始编辑代码
import requests,re
import pymongo
from multiprocessing import Pool
from requests import RequestException
client = pymongo.MongoClient()
db = client.test
#获取页面文本
def get_index_page(offset):
'''
多行注释
:return:
'''
url = 'http://maoyan.com/board/4?offset=%s'%offset
print("开始请求 %s" % url)
try:
response = requests.get(url,headers={})
if response.status_code == 200:
print(response)
html = response.text
reg = r'<img data-src="(.*?)".*?data-val=".*?">(.*?)</a></p>.*?主演:(.*?)\n.*?上映时间:(.*?)</p>'
infos = re.findall(reg,html,re.S)
return infos
except RequestException as err:
print("请求报错 %s" % err)
get_index_page(offset)
else:
print("请求失败 %s %s" % (url,url))
def save_info(infos):
for img_url,title,actor,time in infos:
print(title)
dic = {
'img_url':img_url,
'title':title,
'actor':actor,
'time':time
}
print("正在保存 %s" % dic)
db.movietab.insert(dic)
save_img(img_url,title)
def save_img(url,title):
print("下载图片 %s %s " %(title,url))
response = requests.get(url)
if response.status_code == 200:
data = response.content
with open('imgs/%s.jpg' % title,'wb') as f:
f.write(data)
def main(page):
print('当前页数 %s' % page)
infos = get_index_page(page)
save_info(infos)
if __name__ == "__main__":
pool = Pool(4)
pages = [x*10 for x in range(0,10)]
for page in pages:
print(pages)
pool.apply_async(main(page))
- 正则表达式 reg = r'<img data-src="(.?)".?data-val=".?">(.?)</a></p>.?主演:(.?)\n.?上映时间:(.?)</p>'
这里的 .*? 代表匹配任何字符 ,加()的意思是选中 ,re.S代表跨行匹配 - url
第一页 :http://maoyan.com/board/4?offset=0
第二页:http://maoyan.com/board/4?offset=10
第三页:http://maoyan.com/board/4?offset=20
变化的是offset 递增10
pages = [x*10 for x in range(0,10)] 迭代生成数组
注意:
- 获取文本使用的是response.text,
- 获取图片是response.content
- client = pymongo.MongoClient(),因为我这是本机装的MongoDB 所以不用host 端口 默认就是
总结
从代码的角度来看,确实没有什么难度,主要是思想,使用其他的语言一样可以实现,看完之后不知道你是不是也觉得很简单呢,想上手试试,建议多练!
爱生活,爱分享!
网友评论