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 发送邮件实例代码
Dec 22 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
简述Python2与Python3的不同点
Jan 21 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
Python3实现二叉树的最大深度
Sep 30 Python
Python手绘可视化工具cutecharts使用实例
Dec 05 Python
python全局变量引用与修改过程解析
Jan 07 Python
如何基于Python实现word文档重新排版
Sep 29 Python
python中绕过反爬虫的方法总结
Nov 25 Python
pytorch 实现多个Dataloader同时训练
May 29 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
python中zip()方法应用实例分析
2016/04/16 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
Python处理文本换行符实例代码
2018/02/03 Python
Python实现购物车程序
2018/04/16 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
详解python中__name__的意义以及作用
2019/08/07 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
CSS Houdini实现动态波浪纹效果
2019/07/30 HTML / CSS
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
餐厅考勤管理制度
2014/01/28 职场文书
火锅店营销方案
2014/02/26 职场文书
工作建议书范文
2014/05/13 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
小学生暑假安全公约
2015/07/14 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
如何正确理解python装饰器
2021/06/15 Python
python实现剪贴板的操作
2021/07/01 Python
Mysql数据库group by原理详解
2022/07/07 MySQL