上午废了老大劲成功登陆后,下午看了下BeautifulSoup和pymysql,晚上记录一下

自己电脑装的sublime,字体颜色竟然拷贝不下来 - -

写的过程中遇到了很多问题:

1.模拟登陆部分

模拟登陆看相关教程都是要用的cooklib,但是py3.x不支持这个库,换了http.cookiejar也遇到了一大堆坑,最后发现了request带的有cookie,可以拼装cookie,

然后用alert(document.cookie)获取cookie去拼cookie抓页面,但是每次抓到的都是跳转页面,一度绝望准备放弃,直到N小时候的探索候,发现了httpfox+firedebug!

简直是神器,发现之前alert时获取的cookie少了一个参数,加上去之后神奇的登录上去抓下来页面了,自学大概就是这样吧~碰运气。

2.网站结构分析

今天的目标网站是一个B2B2C网站,爬取的内容是后台的用户数据。

网站结构比较老,需要抓取的数据在table里,每行tr都有一条数据,这个可以直接通过获取所有的tr标签后进行遍历,但是这个网站的手机号字段需要点击获取按钮才可以看到,

用的是ajax+Dialogue模态框(还好前两天刚用php+bootstrap过做了个后台项目,机智如我),通过firedebug+httpfox抓包看到每次点击查看号码后,POST请求的都是同一个页面,

返回的数据竟然不仅仅是手机号!是用户信息的所有字段!网页结构瞬间难度降低.只需要获取总页数和用户Id就可以抓数据了!总页数通过指定的string获取即可,用户Id通过指定

的class获取tag.find('a', attrs={'class':'see'}),然后再去href属性,再取数字,用户的id就被取到了。

3.循环获取数据

上面已经获取了总页数和用户Id了,现在只要循环总页数次*每次的数据tr行数就可以获取全部数据.

在方法外定义一个for循环,循环了总页数次,由于有的用户没有点击查看用户联系方式(vip不可以被查看),导致有时获取用户Id时失败,所以在获取用户id时加了个判断,如果为空,

则跳出本次获取用户数据循环,成功获取数据后发现获取的数据时bytes类型,无法json解析,经过一番资料查询,确定bytes转str再转json,实际执行中发现个别人的数据无法转换,

原因不明,加了个判断先绕过去!至此,已经获取到了想要的数据了,可以通过json名['字段名']获取数据.

4.mysql存储

经过一系列的磨难,就差一步存储就可以完成了.

mysql的python只支持到了3.4版本,所以3.6版本用不了,中间尝试N次失败告终,又在网站搜集一番资料,发现用pymysql,写了个连接测试文件,测试后没问题,拷贝到这里,

万事俱备只欠东风,开始执行xxx.py,直接报错,数据库连接被关闭???然后发现数据库被关闭后再次写入没有开启,调整了下语句,继续测试,ok了,采集了40多页后报错,遇到了对方是

vip的问题,果断判断一下跳过,然后页数循环那里加上判断直接从40+页开始循环,执行到70+页后出现人名无法存数据库,不知道什么原因,直接跳过指定id继续执行,最后成功抓取107页数据.

然后通过phpmyadmin可以导出各种格式.

5.后记

路漫漫其修远兮 吾将上下而求索

自学过程中会遇到各种坑,各种问题,一定要坚持下去,可以通过搜索引擎找到答案.

等有时间了还是要把代码封装一下,规范一点,希望以后可以复用.

虽然最后实现了功能,还是有很多不完善的地方,以后慢慢改进!

#-*-coding:utf-8-*- #编码声明
import requests
from bs4 import BeautifulSoup
import re,time
import pymysql.cursors
import json
def getCookie():
cookie = {}
raw_cookies = 'UM_d=1440;saf=6E4FBE;AJes=7; ASId=45'#引号里面是cookie,用抓包工具来获得
for line in raw_cookies.split(';'):
key,value = line.split("=", 1)
cookie[key] = value #一些格式化操作,用来装载cookies
return cookie
def getData(num):
url = 'http://www.xxx.com/xxx/allmessage_' + str(num) + '.html'
print('当前抓取网址' + url)
 
res = requests.get(url,cookies=getCookie())
content = res.content
saveData(content)
return content
def getPageNum():
url = 'http://www.xxx.com/xxx/allmessage.html'
 
res = requests.get(url,cookies=getCookie())
content = res.content
soup = BeautifulSoup(content,'html.parser')
pageStr = soup.find_all('a')
mystr = pageStr[-1]['href']
pageNum = re.sub("\D", "", mystr)
return pageNum
def saveData(content):
conn = pymysql.Connect(user='root', password='root', database='user',charset="utf8")
 
soup = BeautifulSoup(content,'html.parser')
tb = soup.find_all('tr',style='text-align:center;')
for tag in tb:
 
see = tag.find('a', attrs={'class':'see'})
if not see:
continue
seestr = see['onclick']
seenum = re.sub("\D", "", seestr)
#根据seenum获得指定用户信息
userinfo = seeInfo(int(seenum))
#这个userinfo是 bytes类型,先转换成str,再转换成json,真麻烦!
strdata = str(userinfo, encoding = "utf-8")
strdata = strdata.encode('UTF-8')
if seenum == 404831:
print(strdata)
 
jsondata = json.loads(strdata)
cursor = conn.cursor()
cursor.execute('insert into my_userinfo (see, sendtime, name, phone, content, weixin, qq) values (%s, %s, %s, %s, %s, %s, %s)', [int(seenum), jsondata['time'], jsondata['name'], jsondata['phone'], jsondata['content'], jsondata['weixin'], jsondata['QQ']])
cursor.rowcount
# 提交事务:
conn.commit()
cursor.close()
#print(str(seenum) + '写入成功!')
def seeInfo(id):
url = 'http://www.xxx.com/xxx/tel.html'
info = {'id':id}
 
res = requests.get(url,cookies=getCookie(),data=info)
content = res.content
#with open("./new/json_"+str(id)+".txt", 'wb') as f:
#f.write(content)
return content
maxPage = getPageNum()
for num in range(int(maxPage)):
if page > 106:
 
content = getData(page)
with open("./new/content_"+str(page)+".html", 'wb') as f:
f.write(content)
print('第' + str(page) +'页保存成功!两秒后继续抓取!')
time.sleep(2)

20170717_python_爬虫_网页数据解析_BeautifulSoup_数据保存_pymysql的更多相关文章

  1. Python爬虫教程-18-页面解析和数据提取

    本篇针对的数据是已经存在在页面上的数据,不包括动态生成的数据,今天是对HTML中提取对我们有用的数据,去除无用的数据 Python爬虫教程-18-页面解析和数据提取 结构化数据:先有的结构,再谈数据 ...

  2. 爬虫、网页分析解析辅助工具 Xpath-helper

    每一个写爬虫.或者是做网页分析的人,相信都会因为在定位.获取xpath路径上花费大量的时间,甚至有时候当爬虫框架成熟之后,基本上主要的时间都花费在了页面的解析上.在没有这些辅助工具的日子里,我们只能通 ...

  3. 2.2 Xpath-helper (chrome插件) 爬虫、网页分析解析辅助工具

    1. Xpath-helper下载 可以直接在chrome浏览器中的扩展程序搜索 Xpath-helper进行添加 也可以直接在http://www.chromein.com/crx_11654.ht ...

  4. 爬虫_网页url设计

    为什么需要网页URL设计? 每个url不同的结构代表着不同的网页模块和信息的展现形式,为了方便维护与管理 网页url怎么设计? 分层: 主域名,子域名 一般形式为: 主域名:  www.job.com ...

  5. post请求获取json数据 解析json数据

    <script> window.onload = function () { var str; // console.log(@ViewBag.ID); $.post("/Ser ...

  6. iOS - XML 数据解析

    前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...

  7. ADs系列之通用数据解析服务GAS(即将开源)

    面对成百上千的生产系统用户操作数据接入落地,你是否厌倦了每次机械编写打包解包的代码?对一次性接入多个数据的时候,还要对不同人联调,费时费力,你是否还会手忙脚乱,忙中不断出错?是否当数据出问题了,用的时 ...

  8. iOS开发——网络Swift篇&JSON与XML数据解析

    JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit)   一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...

  9. IOS 请求数据解析 XML 和 JSON

    好久没写文章了,回忆一下以前的内容记录一下吧. 这一段主要接触的就是数据解析,就说一下数据解析 现在数据解析一般解析两种数据 xml 和 JSON 那就从xml解析说起吧 xml解析需要用到一个类 N ...

随机推荐

  1. jquery页面水印插件,支持多行水印、行错开

    最近工作需求,需要在页面上加水印,但发现网上示例无法满足我的需求,所以还是自己动手写. 有几个特别需求: 1.可以写多行水印,并且中心对齐. 2.每行水印错开. PS:我找到的例子都是单行水印,所以用 ...

  2. python通过excel对数据库插入数据

    1.需要有两个包文件xlrd及MySQLdb(其他数据库可以另外找) 2.读取excel文件信息 book = xlrd.open_workbook(文件地址) 3.建立MySQL链接 databas ...

  3. Django rest framework 自定义Exception

    使用Dango rest framework时,有时需要raise APIException到前端,为了统一错误返回格式,我们需要对exception的格式进行调整. 方法: 1. 在project/ ...

  4. python 标准库 -- os

    os os.getcwd() os.getcwd() # 获取当前工作目录 os.listdir(path) os.listdir('/tmp') # 列出指定目录下的文件和目录 os.mkdir(p ...

  5. 安装nginx+lua开发环境

    一.安装nginx及搭建本地测试环境 1.创建安装目录:    /data/nginx2.安装make:        yum-y install gcc automake autoconf libt ...

  6. Java Web开发环境配置(JDK+Tomcat++IDEA 14)

    对于未接触过java web开发的大家而言,应该和我一样对java web编程开发比较迷茫,通过查一些资料,大致清楚了java web开发环境的一些基本配置,未做过相关编程的人员可以看一看,由于我刚接 ...

  7. web移动端布局方式整理

    写H5页面一直写的有点随意,只是保证了页面在各个屏幕下显示良好,却没有保证到在各个屏幕下是等比例放大或者缩小.这些天在写一些页面,试着看看能不能写出等比例放大缩小的页面,发现不容易啊,在网上找了一些文 ...

  8. Sqlserver 2005 跨数据库 导入数据

    --Sqlserver 2005 跨数据库 导入数据:--SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/O ...

  9. 12.引入依赖项目的时候,如果找不到jar

    原因是bin没有生成,先clean依赖包,再clean原工程包,就可以了

  10. Linux下BMP文件不能正常读取问题的解决办法

    今天将之前在win下编好的读取BMP图像功能移植到UNIX下. 碰到的第一个问题是,Linux下的BMP文件头的结构体需要自己重新定义一遍. 第二个问题是,需要搞清楚Linux是32位的还是64位的. ...