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计算时间差的方法
May 20 Python
浅析Python中signal包的使用
Nov 13 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
Dec 05 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
python使用Geany编辑器配置方法
Feb 21 Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 Python
python调用API接口实现登陆短信验证
May 10 Python
Python Request类源码实现方法及原理解析
Aug 17 Python
Python -m参数原理及使用方法解析
Aug 21 Python
python实现暗通道去雾算法的示例
Sep 27 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
文件上传的实现
2006/10/09 PHP
PHP生成条形图的方法
2014/12/10 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
JavaScript中的作用域链和闭包
2012/06/30 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
javascript输出AscII码扩展集中的字符方法
2016/12/26 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
Python中List.index()方法的使用教程
2015/05/20 Python
python if not in 多条件判断代码
2016/09/21 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
pandas去除重复列的实现方法
2019/01/29 Python
pycharm新建一个python工程步骤
2019/07/16 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
2014年上半年工作自我评价
2014/01/18 职场文书
代理班主任的自我评价
2014/02/04 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
单位实习鉴定评语
2015/01/04 职场文书
实习证明格式范文
2015/06/16 职场文书
网吧温馨提示
2015/07/17 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript
JUnit5常用注解的使用
2021/07/02 Java/Android
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python
Spring中的@Transactional的工作原理
2022/06/05 Java/Android
使用Apache Camel表达REST服务的方法
2022/06/10 Servers