才开始学习爬虫,完全是小白,因此需要多多总结和记录,这篇记录里学习的用例都来自于:
https://blog.csdn.net/MTbaby/article/details/79165890
https://blog.csdn.net/MTbaby/article/details/79174036
https://blog.csdn.net/mtbaby/article/details/79191832
一、环境配置
环境:python3+requests+lxml+Pycharm
requests是python实现的简单易用的HTTP库。
lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
安装requests和lxml:
pip install requests
pip install lxml
二、爬取豆瓣电影
地址:https://movie.douban.com/subject/26942674/?from=showing
这里爬取电影的名字和演员名字
爬虫操作步骤:
1、请求并下载电影页面信息
2、解析并定为评分信息
3、保存评分数据
先用requests获取页面信息->用lxml里的etree解析页面->用xpath获取指定位置的信息
(如果是爬取多条信息,通过查看xpath的规律做出相应的修改即可)
xpath信息获取:
获取电影的xpath信息并获得文本:
s.xpath('元素的xpath信息/text()')
text()是获得文本信息,如果想获得网页里其他元素比如title就是@title
手动获取元素的xpath信息:
1、如果你是用谷歌浏览器的话,鼠标“右键”–>“检查元素”
2、Ctrl+Shift+C将鼠标定位到标题。
3、“右键”–> “Copy”–> “Copy Xpath”就可以复制xpath
代码
#-*- coding:utf-8 -*-
import requests
from lxml import etree
import time
#requests+xpath爬取豆瓣#
url='https://movie.douban.com/subject/26942674/?from=showing'
data=requests.get(url).text#通过requests获取页面text
s=etree.HTML(data)#用etree解析页面
name=s.xpath('//*[@id="content"]/h1/span[1]/text()')#通过xpath获得信息
actors=s.xpath('//*[@id="info"]/span[3]/span[2]/a/text()')
print("电影名:", name)#输出信息
print("主演:",actors)
输出结果
三、爬取豆瓣TOP250图书信息
地址:https://book.douban.com/top250
这里爬取图书的书名和链接以及一句话总结
爬取步骤:(和刚才类似)
1、用data = requests.get(url).text获得页面的文本信息
2、用f = etree.HTML(data)解析页面
3、books = f.xpath(xpath信息/@title)获得指定位置内容
注意:
浏览器复制的 xpath 信息并不是完全 可靠的,浏览器经常会自己在里面增加多余的 tbody 标签,我们需要手动把这些标签删掉
代码:
#-*- coding:utf-8 -*-
import requests
from lxml import etree
import time
for i in range(10):
url = 'https://book.douban.com/top250?start={}'.format(i*25)#format用于添加{}里的值,这里是一个页面的url,总共爬取是个页面,以25为单位增加
data = requests.get(url).text#requests获取网页信息
f = etree.HTML(data)#etree解析网页
books = f.xpath('//*[@id="content"]/div/div[1]/div/table')#xpath定位信息的位置,()里是信息的xpath值。这里存储的是每本书的信息
for div in books:#遍历每本书
title = div.xpath('./tr/td[2]/div[1]/a/@title')[0]#xpath里是/@title()还是/text()还是/@href取决于你想要获取哪个元素的信息
score = div.xpath('./tr/td[2]/div[2]/span[2]/text()')[0]#xpath返回的是列表,[0]是取出列表的第一个值,是为了去掉列表的[ ]符号
comment = div.xpath('./tr/td[2]/p[2]/span/text()')
num = div.xpath('./tr/td[2]/div[2]/span[3]/text()')[0].strip('(').strip().strip(')')
'''这行代码用了几个strip() 方法,() 里面表示要删除的内容,
strip(‘(‘) 表示删除括号,strip() 表示删除空白符。
如果不用strip() 方法,有很多无用的信息会被爬取,内容混乱'''
href = div.xpath('./tr/td[2]/div[1]/a/@href')[0]
time.sleep(1) #加个睡眠,防止IP被封
if len(comment)>0:#如果有评论,就输出评论
print('{}-->{}-->{}-->{}-->{}'.format(title,score,comment[0],num,href))
else:#没有就不输出
print('{}-->{}-->{}-->{}'.format(title,score,num,href))
print('\n')
输出结果
四、爬取小猪短租住房信息
步骤都和之前的类似,都是找到要爬取的xpath,然后寻找规律来批量爬取。
代码:
#-*- coding:utf-8 -*-
import requests
from lxml import etree
import time
for i in range(1,6):
url3 = 'http://sz.xiaozhu.com/search-duanzufang-p{}-0/'.format(i)#每一页的网页url规律就是p后面的数字不同
data3 = requests.get(url3).text#获取网页
h = etree.HTML(data3)#解析网页
home = h.xpath('//*[@id="page_list"]/ul/li')#所有住房信息的xpath
time.sleep(2)#防止被封IP所以加个睡眠
for div in home:#获得其中一套房屋的信息
time.sleep(2)
#找到xpath的规律将想要的信息的xpath添加在div后面
title = div.xpath('./div[2]/div/a/span/text()')[0] #标题
price = div.xpath('./div[2]/div/span/i/text()')#价格
describle = div.xpath('./div[2]/div/em/text()')[0].strip()#描述
photo = div.xpath('./a/img/@lazy_src')
#输出信息
print ("{}-->{}-->{}\n{}".format(title,price,describle,photo))
输出结果
五、 总结
采用requests+xpath这种方式进行爬取前面的获取解析网页套路都一样,就是xpath需要自己去网页中找并且寻找规律,这种方式还是比较简单好上手。
不管用什么方式都要记得time.sleep()加个睡眠哦~不然会被封ip