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 ZipFile模块详解
Nov 01 Python
python实用代码片段收集贴
Jun 03 Python
Python中如何获取类属性的列表
Dec 26 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
django js实现部分页面刷新的示例代码
May 28 Python
pandas.DataFrame.to_json按行转json的方法
Jun 05 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
基于python实现雪花算法过程详解
Nov 16 Python
Python使用Matlab命令过程解析
Jun 04 Python
Django crontab定时任务模块操作方法解析
Sep 10 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 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
php的一个登录的类 [推荐]
2007/03/16 PHP
php 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
实例讲解php数据访问
2016/05/09 PHP
Prototype使用指南之range.js
2007/01/10 Javascript
js判断浏览器的比较全的代码
2007/02/13 Javascript
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
电气技术员岗位职责
2013/11/19 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
浅谈Vue的computed计算属性
2022/03/21 Vue.js