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编写C/S网络程序实例教程
Aug 25 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
python 检查是否为中文字符串的方法
Dec 28 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
分析经典Python开发工程师面试题
Apr 08 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
使用python实现mqtt的发布和订阅
May 05 Python
Python通过4种方式实现进程数据通信
Mar 12 Python
python学生管理系统的实现
Apr 05 Python
详解Anaconda 的安装教程
Sep 23 Python
Python操控mysql批量插入数据的实现方法
Oct 27 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 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
咖啡的种类和口感
2021/03/03 新手入门
PHP学习 运算符与运算符优先级
2008/06/15 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
JS实现拖动示例代码
2013/11/01 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
jQuery的内容过滤选择器学习教程
2016/04/18 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
js实现选项卡效果
2020/03/07 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
[01:47]2018年度DOTA2最佳教练-完美盛典
2018/12/16 DOTA
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
python实现学生管理系统
2018/01/11 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
深入浅析python 中的匿名函数
2018/05/21 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
汽修专业学生自我鉴定
2013/11/16 职场文书
自荐书模板
2013/12/19 职场文书
年终考核实施方案
2014/05/26 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
2015年新农合工作总结
2015/03/30 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技