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 相关文章推荐
Python3控制路由器——使用requests重启极路由.py
May 11 Python
在Python的Flask框架中构建Web表单的教程
Jun 04 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
详解Django定时任务模块设计与实践
Jul 24 Python
python解释器spython使用及原理解析
Aug 24 Python
wxpython绘制音频效果
Nov 18 Python
Python操作redis和mongoDB的方法
Dec 19 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
python 实现德洛内三角剖分的操作
Apr 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
Yii2单元测试用法示例
2016/11/12 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
jQuery 使用手册(三)
2009/09/23 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
jQuery插件实现多级联动菜单效果
2015/12/01 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
2020/05/27 Python
Python实现异步IO的示例
2020/11/05 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
高中生学期学习自我评价
2014/02/24 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
机房搬迁方案
2014/05/01 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
古诗之感恩老师
2019/10/24 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android