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绘制3d螺旋曲线图实例代码
Dec 20 Python
用十张图详解TensorFlow数据读取机制(附代码)
Feb 06 Python
python编写暴力破解zip文档程序的实例讲解
Apr 24 Python
Python实现按中文排序的方法示例
Apr 25 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
基于python if 判断选择结构的实例详解
May 06 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
Python matplotlib可视化实例解析
Jun 01 Python
python爬虫容易学吗
Jun 02 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
pycharm Tab键设置成4个空格的操作
Feb 26 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
PHP采集类Snoopy抓取图片实例
2014/06/19 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
js replace正则表达式应用案例讲解
2013/01/17 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
浅析Ajax语法
2016/12/05 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
Python+MongoDB自增键值的简单实现
2016/11/04 Python
python实现简单中文词频统计示例
2017/11/08 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
八年级美术教学反思
2014/02/02 职场文书
开学典礼决心书
2014/03/11 职场文书
餐饮投资计划书
2014/04/25 职场文书
学生安全责任书模板
2014/07/25 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
捐资助学感谢信
2015/01/21 职场文书
南湾猴岛导游词
2015/02/09 职场文书
2015秋季开学典礼新闻稿
2015/07/17 职场文书
新学期开学寄语2016
2015/12/04 职场文书
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript