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 生成目录树及显示文件大小的代码
Jul 23 Python
在Python中使用异步Socket编程性能测试
Jun 25 Python
Python松散正则表达式用法分析
Apr 29 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
python字符串查找函数的用法详解
Jul 08 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
Python二元赋值实用技巧解析
Oct 25 Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 Python
Python之基础函数案例详解
Aug 30 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
ajax缓存问题解决途径
2006/12/06 PHP
PHP 编写的 25个游戏脚本
2009/05/11 PHP
PHP XML操作类DOMDocument
2009/12/16 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
php批量删除操作代码分享
2017/02/26 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
JavaScript国旗变换效果代码
2008/08/13 Javascript
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
Javascript学习指南
2014/12/01 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
python中wx模块的具体使用方法
2020/05/15 Python
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
《月光启蒙》教学反思
2014/03/01 职场文书
保密承诺书
2014/03/27 职场文书
大学新闻系求职信
2014/06/03 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
shell进度条追踪指令执行时间的场景分析
2022/06/16 Servers