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使用metaclass实现Singleton模式的方法
May 05 Python
python处理二进制数据的方法
Jun 03 Python
使用Python保存网页上的图片或者保存页面为截图
Mar 05 Python
Python中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
详谈python read readline readlines的区别
Sep 22 Python
Python 绘图库 Matplotlib 入门教程
Apr 19 Python
Python3.5内置模块之random模块用法实例分析
Apr 26 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
python面试题之列表声明实例分析
Jul 08 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
python dict乱码如何解决
Jun 07 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实现百度网盘图片直链的代码分享
2012/11/01 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
PHP静态文件生成类实例
2014/11/29 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
php适配器模式简单应用示例
2019/10/23 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
php 中序列化和json使用介绍
2013/07/08 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
深入Node TCP模块的理解
2019/03/13 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
Python清空文件并替换内容的实例
2018/10/22 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
python列表生成器迭代器实例解析
2019/12/19 Python
python中pow函数用法及功能说明
2020/12/04 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
《圆明园的毁灭》教学反思
2014/02/28 职场文书
师范大学生求职信
2014/06/13 职场文书
场地使用证明模板
2014/10/25 职场文书
先进个人材料怎么写
2014/12/30 职场文书