python爬取豌豆荚中的详细信息并存储到SQL Server中

  买了本书《精通Python网络爬虫》,看完了第6章,我感觉我好像可以干点什么;学的不多,其中的笔记我放到了GitHub上:https://github.com/NSGUF/PythonLeaning/blob/master/examle-urllib.py,因为我用的python3.0,所以,在爬取数据的时候只用到了一个包:urllib。该博文的源码:https://github.com/NSGUF/PythonLeaning/blob/master/APPInfo.py

  思路:首先,如果进入了豌豆荚的首页可以看到,其图如图1,主要是分为安卓软件和安卓游戏,所以只需得到这里面所有的链接即可,如影音播放,系统工具等;

图1

  当点击随意一个链接时,显示图2,如图可见,该页面会显示每个软件的基本信息,并且会链接到其详细信息上,这时,如果能获取到详细信息的链接就能得到所需的基本信息了;

图2

  由于该网站是分页的,所以必须得到页数,由图可见,每个页面的最大都是42,而具体却没有到42,所以后面会显示图4.没有更多内容了所以,可以循环42次;

图3

图4

  综上所述:可得获取图1中画下划线的链接,同样包括安卓游戏中的该链接

def getAllLinks(url):#获取首页链接的所有子链接
    html1=str(urllib.request.urlopen(url).read())
    pat=‘<a class="cate-link" href="(http://.+?")>‘
    allLink=re.compile(pat).findall(html1)
    allLinks=[]
    for link in allLink:
        allLinks.append(link.split(‘"‘)[0])
    return allLinks

  获取图2中圈起来的链接,因为其有页码,所以得加上页码

def getAllDescLinks(url,page):#获取子链接中所有app指向的链接
    url=url+‘/‘+str(page)
    print(url)
    html1=str(urllib.request.urlopen(url).read().decode(‘utf-8‘))
    pat2=‘<ul id="j-tag-list" class="app-box clearfix">[\s\S]*<div class="pagination">‘
    allLink=str(re.compile(pat2).findall(html1)).strip(‘\n‘).replace(‘ ‘,‘‘).replace(‘\\n‘,‘‘).replace(‘\\t‘,‘‘)
    allLink=allLink.split(‘<divclass="icon-wrap"><ahref="‘)
    allLinks=[]
    for i in range(1,len(allLink)):
        allLinks.append(allLink[i].split(‘"><imgsrc‘)[0])
    allLinks=list(set(allLinks))
    return allLinks

  获取详细信息中的信息:

def getAppName(html):#获取app名字
    pat=‘<span class="title" itemprop="name">[\s\S]*</span>‘
    string=str(re.compile(pat).findall(html))
    name=‘‘
    if string!=‘[]‘:
        name=string.split(‘>‘)[1].split(‘<‘)[0]
    return name
def getDownNumber(html):#下载次数
    pat=‘<i itemprop="interactionCount"[\s\S]*</i>‘
    string=str(re.compile(pat).findall(html))
    num=‘‘
    if string!=‘[]‘:
        num=string.split(‘>‘)[1].split(‘<‘)[0]
    return num
def getScore(html):#评分
    pat=‘<span class="item love">[\s\S]*<i>[\s\S]*好评率</b>‘
    string=str(re.compile(pat).findall(html))
    score=‘‘
    if string!=‘[]‘:
        score=string.split(‘i‘)[2].split(‘>‘)[1].split(‘<‘)[0]
    return score
def getIconLink(html):#app中icom的图片链接
    pat=‘<div class="app-icon"[\s\S]*</div>‘
    image=str(re.compile(pat).findall(html))
    img=‘‘
    if image!=‘[]‘:
        img=‘http://‘+str(image).split(‘http://‘)[1].split(‘.png‘)[0]+‘.png‘
    return img
def getVersion(html):#版本
    pat=‘版本</dt>[\s\S]*<dt>要求‘
    version=str(re.compile(pat).findall(html))
    if version!=‘[]‘:
        version=version.split(‘&nbsp;‘)[1].split(‘</dd>‘)[0]
    return version
def getSize(html):#大小
    pat=‘大小</dt>[\s\S]*<dt>分类‘
    size=str(re.compile(pat).findall(html))
    if size!=‘[]‘:
        size=size.split(‘<dd>‘)[1].split(‘<meta‘)[0].strip(‘\n‘).replace(‘ ‘,‘‘).replace(‘\\n‘,‘‘)#strip删除本身的换行,删除中文的空格,删除\n字符
    return size

def getImages(html):#所有截屏的链接
    pat=‘<div data-length="5" class="overview">[\s\S]*</div>‘
    images1=str(re.compile(pat).findall(html))
    pat1=‘http://[\s\S]*.jpg‘
    images=[]
    images1=str(re.compile(pat1).findall(images1))
    if images1!=‘[]‘:
        images1=images1.split(‘http://‘)
        for i in range(1,len(images1)):
            images.append(images1[i].split(‘.jpg‘)[0]+‘.jpg‘)
    return images
def getAbstract(html):#简介
    pat=‘<div data-originheight="100" class="con" itemprop="description">[\s\S]*<div class="change-info">‘
    abstract=str(re.compile(pat).findall(html))
    if abstract==‘[]‘:
        pat=‘<div data-originheight="100" class="con" itemprop="description">[\s\S]*<div class="all-version">‘
        abstract=str(re.compile(pat).findall(html))
    if abstract!=‘[]‘:
        abstract=abstract.split(‘description">‘)[1].split(‘</div>‘)[0].replace(‘<br>‘,‘‘).replace(‘<br />‘,‘‘)#strip删除本身的换行,删除中文的空格,删除\n字符
    return abstract
def getUpdateTime(html):#更新时间
    pat=‘<time id="baidu_time" itemprop="datePublished"[\s\S]*</time>‘
    updateTime=str(re.compile(pat).findall(html))
    if updateTime!=‘[]‘:
        updateTime=updateTime.split(‘>‘)[1].split(‘<‘)[0]
    return updateTime
def getUpdateCon(html):#更新内容
    pat=‘<div class="change-info">[\s\S]*<div class="all-version">‘
    update=str(re.compile(pat).findall(html))
    if update!=‘[]‘:
        update=update.split(‘"con">‘)[1].split(‘</div>‘)[0].replace(‘<br>‘,‘‘).replace(‘<br />‘,‘‘)#strip删除本身的换行,删除中文的空格,删除\n字符
    return update
def getCompany(html):#开发公司
    pat=‘<span class="dev-sites" itemprop="name">[\s\S]*</span>‘
    com=str(re.compile(pat).findall(html))
    if com!=‘[]‘:
        com=com.split(‘"name">‘)[1].split(‘<‘)[0]#strip删除本身的换行,删除中文的空格,删除\n字符
    return com
def getClass(html):#所属分类
    pat=‘<dd class="tag-box">[\s\S]*<dt>TAG</dt>‘
    classfy1=str(re.compile(pat).findall(html))
    classfy=[]
    if classfy1!=‘[]‘:
        classfy1=classfy1.split(‘appTag">‘)
        for i in range(1,len(classfy1)):
            classfy.append(classfy1[i].split(‘<‘)[0])
    return classfy
def getTag(html):#标有的Tag
    pat=‘<div class="side-tags clearfix">[\s\S]*<dt>更新</dt>‘
    tag1=str(re.compile(pat).findall(html))
    tag=[]
    if tag1!=‘[]‘:
        tag1=tag1.strip(‘\n‘).replace(‘ ‘,‘‘).replace(‘\\n‘,‘‘).split(‘</a>‘)
        for i in range(0,len(tag1)-1):
            tag.append(tag1[i].replace(‘<divclass="side-tagsclearfix">‘,‘‘).replace(‘<divclass="tag-box">‘,‘‘).replace(‘</div>‘,‘‘).split(‘>‘)[1])
    return tag
def getDownLink(html):#下载链接
    pat=‘<div class="qr-info">[\s\S]*<div class="num-list">‘
    link=str(re.compile(pat).findall(html))
    if link!=‘[]‘:
        link=link.split(‘href="http://‘)[1].split(‘" rel="nofollow"‘)[0]
    return link
def getComment(html):#评论内容(只包含10条,因为网页只显示有限)
    pat=‘<ul class="comments-list">[\s\S]*<div class="hot-tags">‘
    comm=str(re.compile(pat).findall(html))
    comms=‘‘
    eval_descs=[]
    if comm!=‘[]‘:
        comms=comm.strip(‘\n‘).replace(‘ ‘,‘‘).replace(‘\\n‘,‘‘).split(‘<liclass="normal-li">‘)
        for i in range(1,len(comms)-1):
            userName=comms[i].split(‘name">‘)[1].split(‘<‘)[0]
            time=comms[i].split(‘</span><span>‘)[1].split(‘<‘)[0]
            evalDesc=comms[i].split(‘content"><span>‘)[1].split(‘<‘)[0]
            eval_desc={‘userName‘:userName,‘time‘:time,‘evalDesc‘:evalDesc}
            eval_descs.append(eval_desc)
    # comm=comm.split(‘href="http://‘)[1].split(‘" rel="nofollow"‘)[0]
    return eval_descs

  将信息插入SQL数据库,这里注意execute后面用的占位符是?,之前我看了很多其他的资料,用的是%s,报错了,最无语的是报错居然还乱码了。

def insertAllInfo(name,num,icon,score,appversion,size,images,abstract,updateTime,updateCon,com,classfy,tag,downLink,comm):#插入SQL数据库
    import pyodbc
    conn = pyodbc.connect(‘DRIVER={SQL Server};SERVER=127.0.0.1,1433;DATABASE=Test;UID=sa;PWD=123‘)
    #连接之后需要先建立cursor:
    cursor = conn.cursor()
    try:
        cursor = conn.cursor()
        cursor.execute(‘insert into tb_wandoujia(name,num,icon,score,appversion,size,images,abstract,updateTime,updateCon,com,classfy,tag,downLink,comm) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)‘,(name,num,icon,score,appversion,size,images,abstract,updateTime,updateCon,com,classfy,tag,downLink,comm))
        conn.commit()# 不执行不能插入数据
        print(‘成功‘)
    except Exception as e:
        print(str(e))
    finally:
        conn.close()

  数据库创建代码如下:

create database Test

CREATE TABLE [dbo].[tb_wandoujia](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](100) NULL,
    [num] [varchar](100) NULL,
    [icon] [varchar](200) NULL,
    [score] [varchar](10) NULL,
    [appversion] [varchar](20) NULL,
    [size] [varchar](20) NULL,
    [images] [varchar](2000) NULL,
    [abstract] [varchar](2000) NULL,
    [updateTime] [varchar](20) NULL,
    [updateCon] [varchar](2000) NULL,
    [com] [varchar](50) NULL,
    [classfy] [varchar](200) NULL,
    [tag] [varchar](300) NULL,
    [downLink] [varchar](200) NULL,
    [comm] [varchar](5000) NULL,
PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

  调用获取所有信息、打印并插入数据库:

def getAllInfo(url):#获取所有信息
    html1=str(urllib.request.urlopen(url).read().decode(‘utf-8‘))
    name=getAppName(html1)
    print(‘名称:‘,name)
    if name==‘‘:
        return
    num=str(getDownNumber(html1))
    print(‘下载次数:‘,num)
    icon=str(getIconLink(html1))
    print(‘log链接:‘,icon)
    score=str(getScore(html1))
    print(‘评分:‘,score)
    version=str(getVersion(html1))
    print(‘版本:‘,version)
    size=str(getSize(html1))
    print(‘大小:‘,size)
    images=str(getImages(html1))
    print(‘截图:‘,images)
    abstract=str(getAbstract(html1))
    print("简介:",abstract)
    updateTime=str(getUpdateTime(html1))
    print(‘更新时间:‘,updateTime)
    updateCon=str(getUpdateCon(html1))
    print(‘更新内容:‘,updateCon)
    com=str(getCompany(html1))
    print(‘公司:‘,com)
    classfy=str(getClass(html1))
    print(‘分类:‘,classfy)
    tag=str(getTag(html1))
    print(‘Tag:‘,tag)
    downLink=str(getDownLink(html1))
    print(‘下载链接:‘,downLink)
    comm=str(getComment(html1))
    print(‘评价:‘,comm)
    if name!=‘‘:
        insertAllInfo(name,num,icon,score,version,size,images,abstract,updateTime,updateCon,com,classfy,tag,downLink,comm)

  最后,循环调用,获取全部的信息:

for link in getAllLinks(url):
    print(link)
    for i in range(1,42):#由于豌豆荚给的最大是42页,所以这里用42,反正如果没有42,也会很快
        print(i)
        for descLink in getAllDescLinks(link,i):
            print(descLink)
            getAllInfo(descLink)

  最后打印的结果如下图:

  存储到sql数据库的图片如下:

时间: 2024-10-13 12:15:44

python爬取豌豆荚中的详细信息并存储到SQL Server中的相关文章

系统断定检查已失败。有关详细信息,请查看 SQL Server 错误日志

[1]报错信息 运行删除时报错 操作的删除语句: IF OBJECT_ID('tempdb..#temp_Robot') IS NOT NULL DROP TABLE #temp_Robot CREATE TABLE #temp_Robot(UserID INT NOT NULL PRIMARY KEY) select * from #temp_robot INSERT INTO #temp_Robot SELECT UserID FROM Db_Tank..Sys_Users_Order WH

用 Python 爬取网易严选妹子内衣信息,探究妹纸们的偏好

今天继续来分析爬虫数据分析文章,一起来看看网易严选商品评论的获取和分析. ? 网易商品评论爬取 分析网页 ? 评论分析 进入到网易严选官网,搜索“文胸”后,先随便点进一个商品. ? 在商品页面,打开 Chrome 的控制台,切换至 Network 页,再把商品页面切换到评价标签下,选择一个评论文字,如“薄款.穿着舒适.满意”,在 Network 中搜索. ? 可以发现,评论文字是通过 listByItemByTag.json 传递过来的,点击进入该请求,并拷贝出该请求的 URL: https:/

python爬取科学网基金项目信息

听说学校快开学了...任务再不快点做的话,估计开学要被导师骂死,所以要查一下近年来自己研究领域的基金中标情况! 遇到的问题 导师给了个科学网的网址让我自己查基金,查完告诉他结果,可是! 在科学网查询的时候,发现只要同一IP短时间内访问 10次 左右,网页就会说你 访问太频繁 了...然后 等个10分钟左右才能重新访问 在科学网碰壁后,我先是查了下有没有别的基金查询网站,然后发现在一众网站中,还是科学网的信息更全面一点(nsfc,medsci,letpub等),然后就还是爬虫叭!!! 1. 了解科

Python 爬取美女图片,分目录多级存储

最近有个需求:下载https://mm.meiji2.com/网站的图片. 所以简单研究了一下爬虫. 在此整理一下结果,一为自己记录,二给后人一些方向. 爬取结果如图: 整体研究周期 2-3 天,看完之后,在加上看的时候或多或少也会自己搜到一些其他知识. 顺着看下来,应该会对爬虫技术有一个初步的认识. 大致的步骤: 分析页面,编写爬虫规则 下载图片,如果有分页,则分页 多页爬取,并且分目录保存到本地,多级存储. 应对反爬虫 以上就是学习的时候,看到的一些资料. 然后贴出一篇我自己写的,爬取的时候

python 爬取B站视频弹幕信息

获取B站视频弹幕,相对来说很简单,需要用到的知识点有requests.re两个库.requests用来获得网页信息,re正则匹配获取你需要的信息,当然还有其他的方法,例如Xpath.进入你所观看的视频的页面,F12进入开发者工具,选择网络.查找我们需要的信息,发现域名那列有comment.bilibili.com 格式为xml ,文件名即为cid号.点击它后,在右边的消息头中复制请求网址,在浏览器中打开,即可获得视频全部弹幕信息.    代码如下: 1 import requests 2 imp

python爬取b站排行榜视频信息

和上一篇相比,差别不是很大 1 import xlrd#读取excel 2 import xlwt#写入excel 3 import requests 4 import linecache 5 import wordcloud 6 import jieba 7 import matplotlib.pyplot as plt 8 from bs4 import BeautifulSoup 9 10 if __name__=="__main__": 11 f = xlwt.Workbook

使用python爬取MedSci上的影响因子排名靠前的文献

使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn/sci的交互过程.可以使用谷歌或火狐浏览器的“审查元素-->Network”,然后就可以看到操作页面就可以看到网站的交互信息.当在网页上点击“我要查询”时,网页会发送一个POST消息给服务器,然后,服务器返回查询结果 然后,将查询到的结果使用正则表达式提取出需要的数据. 最后将提取出的数据输出到文

利用Python爬取豆瓣电影

目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com/tag/#/?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD,%E9%BB%91%E5%B8%AE 有3个字段是非常重要的: 1.sort=T 2.range=0,10 3.tag

在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题

原文:在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题 SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="D:\KK.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$] 问题: 消息 15281,级别 16,状态 1,第 1 行 SQL Server 阻止了对组件 'Ad Hoc Di