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写的一个文本编辑器
Jan 23 Python
python验证码识别的实例详解
Sep 09 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
Jun 04 Python
详解python实现数据归一化处理的方式:(0,1)标准化
Jul 17 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
Python3 selenium 实现QQ群接龙自动化功能
Apr 17 Python
python轮询机制控制led实例
May 03 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 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函数之子字符串替换 str_replace
2011/03/23 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
js 如何实现对数据库的增删改查
2012/11/23 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
[41:05]Serenity vs Pain 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python中的Numpy入门教程
2014/04/26 Python
python获取图片颜色信息的方法
2015/03/18 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
python  logging日志打印过程解析
2019/10/22 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
会计电算化专业毕业生自荐信
2013/12/20 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
数字化校园建设方案
2014/05/03 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript