python完整的爬虫实例(当当图书)
整理了一个简单的爬虫实例,用的是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完整的爬虫实例(当当图书)相关推荐
- R语言爬虫:当当图书畅销榜(近7日)
时间:2018-10-9 爬取内容:当当图书畅销榜(近7日):书名.作者.出版社.推荐率.出版时间.价格.折扣.网址 R语言爬虫:当当图书畅销榜(近7日) 通过对其他人爬虫代码的学习,发现有相当一部分 ...
- python日记Day23——爬虫实例之淘宝商品定价
python日记--爬虫实例之淘宝商品定价 需求:爬取淘宝网站手机页面并输出商品名称和价格,实现多页爬取且内容需保存到excel 步骤: getHtml():获取页面信息 parsePage():实现 ...
- Python笔记-多线程爬虫实例
如下,线程池两个线程: 线程池关键代码: 源码如下: import re, multiprocessing import requests, timeclass HandleLaGou(object) ...
- python应用:爬虫实例(静态网页)
爬取起点中文网某本小说实例: 1 # -*-coding:utf8-*- 2 import requests 3 import urllib 4 import urllib2 5 from bs4 i ...
- Python进阶之Scrapy-redis分布式爬虫抓取当当图书
Python进阶之Scrapy-redis分布式爬虫抓取当当图书 1. 准备工作 1.1 安装scrapy-redis 1.2 在windows安装redis程序 1.3 打开redis服务 2. 需 ...
- python scrapy框架爬虫当当图书网
最近在复习scrapy框架,就随便找了个网站做了一下爬虫,当当网,说实话这种网站还是比较好做爬虫的,我没加代理,也没限速,没写多线程,就直接搞下来了,数据量还是比较可观的.接下来进入正题: 先看一下整 ...
- python爬取公交车站数据_Python爬虫实例_城市公交网络站点数据的爬取方法
爬取的站点:http://beijing.8684.cn/ (1)环境配置,直接上代码: # -*- coding: utf-8 -*- import requests ##导入requests fr ...
- python爬虫实例网易云-Python3爬虫实例之网易云音乐爬虫
本篇文章给大家带来的内容是Python3爬虫实例之网易云音乐爬虫.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 此次的目标是爬取网易云音乐上指定歌曲所有评论并生成词云 具体步骤: ...
- Python爬虫实例 wallhaven网站高清壁纸爬取。
文章目录 Python爬虫实例 wallhaven网站高清壁纸爬取 一.数据请求 1.分析网页源码 2.全网页获取 二.数据处理 1.提取原图所在网页链接 2.获取高清图片地址及title 三.下载图 ...
最新文章
- 【廖雪峰python进阶笔记】类的继承
- 计算机视觉:让冰冷的机器看懂这个多彩的世界
- java+jtextfield+取值_[求助]JTextfield 取值问题!
- Breeze库API总结(Spark线性代数库)(转载)
- Java加密与解密的艺术~AES实现
- php 删除字符串中链接_python面试——删除字符串中的“b”和“ac”,删除后无b和ac(CloudIn(云英)面经)...
- 【SpringBoot】项目打成 jar 包后关于配置文件的外部化配置
- black-box优化——第一篇:基础BBO算法
- citrix web Interface5.3 访问WEB网站时,下载本地客户端
- dnf上海2服务器维护,DNF上海2出现大面积盗号并迅速蔓延请注意
- oracle 自动关闭 数据库连接
- oracle数据泵功能,Oracle数据泵的使用(1)-Oracle
- TiledMap快捷键
- 杭州仁和金融中心远程预付费电能管理系统的设计与应用-安科瑞耿敏花
- 录音文件怎么转换成文字呢?
- c语言编程运动会分数统计系统报告,C语言课程设计报告运动会分数统计系统.pdf...
- 《软件方法》第1章 建模和UML
- python头像教程_微信好友头像全家福详细教程python版
- 基于微信小程序的核酸检测系统源码
- 5、收集资料与绘制原理图库和pcb库
热门文章
- [C语言]字符图案:从键盘输入一个正整数n(代表行数),打印如下n行图案。注意第一行左侧不留空白,从第二行开始,每行左侧增加1个空格。请使用数组实现。***** ***** *****
- ORA-12518: TNS:listener could not hand off client connection 解决办法
- php加速配置,php 提速工具eAccelerator 配置参数详解
- 改改改, 我实在是烦了
- 毕业设计Spring boot问题记录(后端二):No qualifying bean of type “xxx“: expected at least 1 bean which qualifies…
- 输入时间的前一秒和后一秒(c语言)
- English语法_分词用法-分词构句
- 无线烟感器(NB-IoT)
- PHP提取富文本中的纯文字
- PowerBI-日期和时间函数-HOUR\MINUTE\SECOND