requests和lxml实现爬虫的方法


Posted in Python onJune 11, 2017

如下所示:

# requests模块来请求页面
# lxml模块的html构建selector选择器(格式化响应response)
# from lxml import html
# import requests

# response = requests.get(url).content

# selector = html.formatstring(response)

# hrefs = selector.xpath('/html/body//div[@class='feed-item _j_feed_item']/a/@href')

# 以url = 'https://www.mafengwo.cn/gonglve/ziyouxing/2033.html'为例子

# python 2.7
import requests
from lxml import html
import os
# 获取首页中子页的url链接
def get_page_urls(url):
  response = requests.get(url).content
  # 通过lxml的html来构建选择器
  selector = html.fromstring(response)
  urls = []
  for i in selector.xpath("/html/body//div[@class='feed-item _j_feed_item']/a/@href"):
    urls.append(i)
  return urls
# get title from a child's html(div[@class='title'])
def get_page_a_title(url):
  '''url is ziyouxing's a@href'''
  response = requests.get(url).content
  selector = html.fromstring(response)
  # get xpath by chrome's tool --> /html/body//div[@class='title']/text()
  a_title = selector.xpath("/html/body//div[@class='title']/text()")
  return a_title
# 获取页面选择器(通过lxml的html构建)
def get_selector(url):
  response = requests.get(url).content
  selector = html.fromstring(response)
  return selector
# 通过chrome的开发者工具分析html页面结构后发现,我们需要获取的文本内容主要显示在div[@class='l-topic']和div[@class='p-section']中
# 获取所需的文本内容
 def get_page_content(selector):
   # /html/body/div[2]/div[2]/div[1]/div[@class='l-topic']/p/text()
   page_title = selector.xpath("//div[@class='l-topic']/p/text()")
   # /html/body/div[2]/div[2]/div[1]/div[2]/div[15]/div[@class='p-section']/text()
   page_content = selector.xpath("//div[@class='p-section']/text()")
   return page_title,page_content
# 获取页面中的图片url地址
def get_image_urls(selector):
  imagesrcs = selector.xpath("//img[@class='_j_lazyload']/@src")
  return imagesrcs
# 获取图片的标题

def get_image_title(selector, num)
  # num 是从2开始的
  url = "/html/body/div[2]/div[2]/div[1]/div[2]/div["+num+"]/span[@class='img-an']/text()"
  if selector.xpath(url) is not None:
    image_title = selector.xpath(url)
  else:
    image_title = "map"+str(num) # 没有就起一个
  return image_title
# 下载图片

def downloadimages(selector,number):
  '''number是用来计数的'''
  urls = get_image_urls()
  num = 2
  amount = len(urls)
  for url in urls:
    image_title = get_image_title(selector, num)
    filename = "/home/WorkSpace/tour/words/result"+number+"/+"image_title+".jpg"
    if not os.path.exists(filename):
      os.makedirs(filename)
    print('downloading %s image %s' %(number, image_title))
    with open(filename, 'wb') as f:
      f.write(requests.get(url).content)
    num += 1
  print "已经下载了%s张图" %num
# 入口,启动并把获取的数据存入文件中
if __name__ =='__main__':
  url = 'https://www.mafengwo.cn/gonglve/ziyouxing/2033.html'
  urls = get_page_urls(url)
  # turn to get response from html
  number = 1
  for i in urls:
    selector = get_selector(i)
    # download images
    downloadimages(selector,number)
    # get text and write into a file
    page_title, page_content = get_page_content(selector)
    result = page_title+'\n'+page_content+'\n\n'
    path = "/home/WorkSpace/tour/words/result"+num+"/"
    if not os.path.exists(filename):
      os.makedirs(filename)
    filename = path + "num"+".txt"
    with open(filename,'wb') as f:
      f.write(result)
    print result

到此就结束了该爬虫,爬取页面前一定要认真分析html结构,有些页面是由js生成,该页面比较简单,没涉及到js的处理,日后的随笔中会有相关分享

以上这篇requests和lxml实现爬虫的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
Python从零开始创建区块链
Mar 06 Python
基于python神经卷积网络的人脸识别
May 24 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
python调用支付宝支付接口流程
Aug 15 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
python读取hdfs并返回dataframe教程
Jun 05 Python
python 用opencv实现霍夫线变换
Nov 27 Python
python 合并多个excel中同名的sheet
Jan 22 Python
Python答题卡识别并给出分数的实现代码
Jun 22 Python
Python实现自动登录百度空间的方法
Jun 10 #Python
Python实现获取命令行输出结果的方法
Jun 10 #Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 #Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 #Python
python+requests+unittest API接口测试实例(详解)
Jun 10 #Python
基于python爬虫数据处理(详解)
Jun 10 #Python
python实现稀疏矩阵示例代码
Jun 09 #Python
You might like
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
js时间控件只显示年月
2017/01/08 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python操作MongoDB基础知识
2013/11/01 Python
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
Python while循环使用else语句代码实例
2020/02/07 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
职员竞岗演讲稿
2014/05/14 职场文书
公司建议书怎么写
2014/05/15 职场文书
宣传委员竞选稿
2015/11/19 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers