整理了一个简单的爬虫实例,用的是python 3.7

一、找到目标网站,分析网站代码结构

以当当为例:

http://search.dangdang.com/?key=%D0%C4%C0%ED%D1%A7&act=input&page_index=1

我们需要获取图书列表中的书名、作者、图片等信息,首先需要找到它的HTML代码段,分析它的结构,以便用合适的方法get到我们需要的信息。

定位到了图书列表:

继续找到文字、图片等我们需要的信息所在的路径:

二、信息的提取

文字的提取:

按照上文找到的路径进行常规的信息爬取,但是在提取书名的时候发现,他的名字是分开的,用text()无法全部提取,所有用到了string()将<a 下的所有文字合并成一个string提取出来。其他信息同样方法提取即可。将提取的信息存放在一个数组中

for i in range(1, x):arr[0].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="name"]/a)', s=i))  # 标题arr[1].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="price"]/span)', s=i))  # 现价arr[2].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="search_book_author"]/span[1])', s=i))  # 作者arr[3].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="search_book_author"]/span[2])', s=i))  # 出版时间arr[4].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="search_book_author"]/span[3])', s=i))  # 出版社

图片的提取:

提取的时候发现图片的网站并不在统一的路径下,它会随机的出现在<img src 下,或者是<img data-original 下,所以需要一步判断,将取出的图片网址放到数组中。

    img_line = str(result.xpath('string(//ul[@class="bigimg"]/li[$s]/a/img/@src)', s=i))img_comp = "http"img_flg = re.compile(img_comp, re.S)result_img = img_flg.findall(img_line)if result_img:arr[5].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/a/img/@src)', s=i))else:arr[5].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/a/img/@data-original)', s=i))

最后将存放文字信息和图片网址信息的数组加到一个字典中,以便下一步的操作。

三、信息的存储(文字信息存放在mysql中,图片存放在本地文件夹)

文字的存储:

将文字存储在本地数据库中

    for i in range(len(item_z['b1'])):title = item_z['b1'][i]price = item_z['b2'][i]author = item_z['b3'][i]date = item_z['b4'][i]company = item_z['b5'][i]sql_t = "insert into books values(null,%s,%s,%s,%s,%s)"parm_t = (title, price, author, date, company)cur.execute(sql_t, parm_t)

图片的存储:

将图片存放在本地指定文件夹中

在给图片命名的时候,我想用上一步提取的书名来命名,但是发现书名包含了部分的简介,并不是单纯的书名,所以我将书名进行了整理,截取出了合适的书名用来命名图片:

书名的整理:

    for imagename_i in range(0, len(img_list['b6'])):imgname_org = img_list['b1'][imagename_i]imgname_comp = ":"imgname_maohao = re.compile(imgname_comp, re.S)imgname_maohao_res = imgname_maohao.findall(imgname_org)  # 此时有冒号的被分开if imgname_maohao_res:    # 名字中有“:”imgname_split = imgname_org.split(":")else:  #按空格分开imgname_split = imgname_org.split()imgname_res = imgname_split[0]  #选取截取后的名字存入数组img_arr.append(imgname_res)

存储到指定的文件夹:

    #下载到本地文件夹folder_path = "D:\\work\\python_objs\\book\\images_1\\"for image_flg in range(0, len(img_list['b6'])):image_path = folder_path + str(page) + "." + str(image_flg+1) + "-" + img_arr[image_flg] + ".png"image_url = requests.get(img_list['b6'][image_flg])image_url.raise_for_status()with open(image_path, 'wb') as fd:fd.write(image_url.content)fd.close()

源代码:

# encoding=utf-8
import requests
import pymysql
import re
import chardet
from lxml import etree
import os
from bs4 import BeautifulSoup
# BeautifulSoup 是HTML解析库def get_onepage(page):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'}url = 'http://search.dangdang.com/?key=%D0%C4%C0%ED%D1%A7&act=input&page_index='+str(page)res = requests.get(url, headers=headers)res.encoding = chardet.detect(res.content)['encoding']  # 自动编码return res.textdef parse_onepage (html):result = etree.HTML(html)#解析到数组x = 1arr = [[] for i in range(6)]while (result.xpath('string(//ul[@class="bigimg"]/li[$s])', s=x)):x += 1for i in range(1, x):arr[0].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="name"]/a)', s=i))  # 标题arr[1].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="price"]/span)', s=i))  # 现价arr[2].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="search_book_author"]/span[1])', s=i))  # 作者arr[3].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="search_book_author"]/span[2])', s=i))  # 出版时间arr[4].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/p[@class="search_book_author"]/span[3])', s=i))  # 出版社#处理图片链接img_line = str(result.xpath('string(//ul[@class="bigimg"]/li[$s]/a/img/@src)', s=i))img_comp = "http"img_flg = re.compile(img_comp, re.S)result_img = img_flg.findall(img_line)if result_img:arr[5].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/a/img/@src)', s=i))else:arr[5].append(result.xpath('string(//ul[@class="bigimg"]/li[$s]/a/img/@data-original)', s=i))#数据清理for i in range(len(arr[3])): #去除出版时间前的"/"arr[3][i] = arr[3][i].lstrip(' /')for i in range(len(arr[4])):  # 去除出版社前的"/"arr[4][i] = arr[4][i].lstrip(' /')#封装到字典item = {}item['b1'] = arr[0]item['b2'] = arr[1]item['b3'] = arr[2]item['b4'] = arr[3]item['b5'] = arr[4]item['b6'] = arr[5]return itemdef write_toMysql(item_z):con = pymysql.connect(host='localhost', user='root', passwd='123456', db='dangdang_book', charset='utf8')cur = con.cursor()for i in range(len(item_z['b1'])):title = item_z['b1'][i]price = item_z['b2'][i]author = item_z['b3'][i]date = item_z['b4'][i]company = item_z['b5'][i]sql_t = "insert into books values(null,%s,%s,%s,%s,%s)"parm_t = (title, price, author, date, company)cur.execute(sql_t, parm_t)con.commit()cur.close()con.close()def save_img(img_list, page):#清洗书名,用以为图片命名:#如果有“:”则分开,若没有则按空格分开img_arr = []for imagename_i in range(0, len(img_list['b6'])):imgname_org = img_list['b1'][imagename_i]imgname_comp = ":"imgname_maohao = re.compile(imgname_comp, re.S)imgname_maohao_res = imgname_maohao.findall(imgname_org)  # 此时有冒号的被分开if imgname_maohao_res:    # 名字中有“:”imgname_split = imgname_org.split(":")else:  #按空格分开imgname_split = imgname_org.split()imgname_res = imgname_split[0]  #选取截取后的名字存入数组img_arr.append(imgname_res)#下载到本地文件夹folder_path = "D:\\work\\python_objs\\book\\images_1\\"for image_flg in range(0, len(img_list['b6'])):image_path = folder_path + str(page) + "." + str(image_flg+1) + "-" + img_arr[image_flg] + ".png"image_url = requests.get(img_list['b6'][image_flg])image_url.raise_for_status()with open(image_path, 'wb') as fd:fd.write(image_url.content)fd.close()def main(page):#获取单页HTMLhtml = get_onepage(page)#解析htmlitem_z = parse_onepage(html)#写进数据库mysqlwrite_toMysql(item_z)#存储图片到本地save_img(item_z, page)if __name__ == '__main__':for i in range(1, 11):  #分页,爬取前十页的信息main(i)

python完整的爬虫实例(当当图书)相关推荐

  1. R语言爬虫:当当图书畅销榜(近7日)

    时间:2018-10-9 爬取内容:当当图书畅销榜(近7日):书名.作者.出版社.推荐率.出版时间.价格.折扣.网址 R语言爬虫:当当图书畅销榜(近7日) 通过对其他人爬虫代码的学习,发现有相当一部分 ...

  2. python日记Day23——爬虫实例之淘宝商品定价

    python日记--爬虫实例之淘宝商品定价 需求:爬取淘宝网站手机页面并输出商品名称和价格,实现多页爬取且内容需保存到excel 步骤: getHtml():获取页面信息 parsePage():实现 ...

  3. Python笔记-多线程爬虫实例

    如下,线程池两个线程: 线程池关键代码: 源码如下: import re, multiprocessing import requests, timeclass HandleLaGou(object) ...

  4. python应用:爬虫实例(静态网页)

    爬取起点中文网某本小说实例: 1 # -*-coding:utf8-*- 2 import requests 3 import urllib 4 import urllib2 5 from bs4 i ...

  5. Python进阶之Scrapy-redis分布式爬虫抓取当当图书

    Python进阶之Scrapy-redis分布式爬虫抓取当当图书 1. 准备工作 1.1 安装scrapy-redis 1.2 在windows安装redis程序 1.3 打开redis服务 2. 需 ...

  6. python scrapy框架爬虫当当图书网

    最近在复习scrapy框架,就随便找了个网站做了一下爬虫,当当网,说实话这种网站还是比较好做爬虫的,我没加代理,也没限速,没写多线程,就直接搞下来了,数据量还是比较可观的.接下来进入正题: 先看一下整 ...

  7. python爬取公交车站数据_Python爬虫实例_城市公交网络站点数据的爬取方法

    爬取的站点:http://beijing.8684.cn/ (1)环境配置,直接上代码: # -*- coding: utf-8 -*- import requests ##导入requests fr ...

  8. python爬虫实例网易云-Python3爬虫实例之网易云音乐爬虫

    本篇文章给大家带来的内容是Python3爬虫实例之网易云音乐爬虫.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 此次的目标是爬取网易云音乐上指定歌曲所有评论并生成词云 具体步骤: ...

  9. Python爬虫实例 wallhaven网站高清壁纸爬取。

    文章目录 Python爬虫实例 wallhaven网站高清壁纸爬取 一.数据请求 1.分析网页源码 2.全网页获取 二.数据处理 1.提取原图所在网页链接 2.获取高清图片地址及title 三.下载图 ...

最新文章

  1. 【廖雪峰python进阶笔记】类的继承
  2. 计算机视觉:让冰冷的机器看懂这个多彩的世界
  3. java+jtextfield+取值_[求助]JTextfield 取值问题!
  4. Breeze库API总结(Spark线性代数库)(转载)
  5. Java加密与解密的艺术~AES实现
  6. php 删除字符串中链接_python面试——删除字符串中的“b”和“ac”,删除后无b和ac(CloudIn(云英)面经)...
  7. 【SpringBoot】项目打成 jar 包后关于配置文件的外部化配置
  8. black-box优化——第一篇:基础BBO算法
  9. citrix web Interface5.3 访问WEB网站时,下载本地客户端
  10. dnf上海2服务器维护,DNF上海2出现大面积盗号并迅速蔓延请注意
  11. oracle 自动关闭 数据库连接
  12. oracle数据泵功能,Oracle数据泵的使用(1)-Oracle
  13. TiledMap快捷键
  14. 杭州仁和金融中心远程预付费电能管理系统的设计与应用-安科瑞耿敏花
  15. 录音文件怎么转换成文字呢?
  16. c语言编程运动会分数统计系统报告,C语言课程设计报告运动会分数统计系统.pdf...
  17. 《软件方法》第1章 建模和UML
  18. python头像教程_微信好友头像全家福详细教程python版
  19. 基于微信小程序的核酸检测系统源码
  20. 5、收集资料与绘制原理图库和pcb库

热门文章

  1. [C语言]字符图案:从键盘输入一个正整数n(代表行数),打印如下n行图案。注意第一行左侧不留空白,从第二行开始,每行左侧增加1个空格。请使用数组实现。***** ***** *****
  2. ORA-12518: TNS:listener could not hand off client connection 解决办法
  3. php加速配置,php 提速工具eAccelerator 配置参数详解
  4. 改改改, 我实在是烦了
  5. 毕业设计Spring boot问题记录(后端二):No qualifying bean of type “xxx“: expected at least 1 bean which qualifies…
  6. 输入时间的前一秒和后一秒(c语言)
  7. English语法_分词用法-分词构句
  8. 无线烟感器(NB-IoT)
  9. PHP提取富文本中的纯文字
  10. PowerBI-日期和时间函数-HOUR\MINUTE\SECOND