第一只可爱滴小爬虫

使用BeautifulSoup入门源码
视频地址

使用python2.7
使用Chrome网页,右键检查工具获取需要内容的类或者id

#coding=utf-8
import requests #网络请求
from bs4 import BeautifulSoup#网页元素解析
import json#json数据解析
import re#正则表达式
import time#延时
import pandas#数据分析
import sqlite3#数据存储

#newsurl = "http://news.sina.com.cn/china"

#获取评论数
common_js = "http://comment5.news.sina.com.cn/page/info?version=1&format=json&channel=gn&newsid=comos-{}&group=undefined&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=3&t_size=3&h_size=3&thread=1&callback=jsonp_1517920852693&_=1517920852693"

#获取评论数
def getNewsConmmontUrl(new_url):
#    news_id = sub_url.split("/")[-1].strip("doc-i").rstrip(".shtml")
    #print(news_id)
    news_id = re.search("doc-i(.+).shtml",new_url).group(1) #使用正则获取新闻id
    res = requests.get(common_js.format(news_id))
    response = res.text.strip("jsonp_1517920852693(")[:-1]
    jd = json.loads(response)
    if jd["result"] != None and jd["result"]["count"] != None and jd["result"]["count"]["total"]:
        return jd["result"]["count"]["total"]
    return 0

#获取文章详情
def getNewsDetail(sub_new_url):
    result = {}
    res = requests.get(sub_new_url)
    soup = BeautifulSoup(res.text.encode(res.encoding).decode('utf-8'),"lxml")#lxml是编译器类型,也可指定html.parser
    result["articleUrl"] = sub_new_url;
    result["articleTitle"] = soup.select(".main-title")[0].text#文章标题
    result["articleTime"] = soup.select(".date-source")[0].select("span")[0].text#时间
    result["articleContent"] = "\n".join([p.text.strip() for p in soup.select("#article p")[:-1]]) #文章内容
    result["articleAuthor"] = soup.select(".show_author")[0].text#作者
    result["articleComment"] = getNewsConmmontUrl(sub_new_url)#评论
    if len(soup.select(".img_wrapper")) > 0:
        result["articlePicture"] = soup.select(".img_wrapper")[0].select("img")[0]["src"]#文章图片
    return result

#分页链接请求
#page_common_url = "http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback&_=1518067220351"

page_common_url = "http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}&callback=newsloadercallback"

#获取分页数据
def getPageDataList(pageIndex):

    page_url = page_common_url.format(pageIndex)#填充url
    page_url_request = requests.get(page_url)#请求数据
    page_url_jd = json.loads(page_url_request.text.lstrip("  newsloadercallback(").rstrip(");"))#解析数据
    sub_url_array = []
    for sub_item in page_url_jd["result"]["data"]:
        sub_url = sub_item["url"]
        if sub_url.find("http") != -1:#判断是否是http开头的url
            sub_url_array.append(sub_url)
    return sub_url_array#新闻url列表

#获取前2页新闻链接URL
def getTotalNewUrlList():

    sub_url_total_array = []
    for i in (0,2):
        sub_url_total_array.extend(getPageDataList(i))#extend可将数组中的数据一个一个的添加进入列表,append是将数组作为一个元素添加到列表
    return sub_url_total_array#列表,存放所有文章url

#获取所有文章内容
def getTotalNewsDetail():
    total_detail_list = []
    for sub_total_url in getTotalNewUrlList():#通过分页获取所有新闻链接
        resultDic = getNewsDetail(sub_total_url)#获取链接详情字典
        time.sleep(1)#爬虫尽量多的延时,也可访问网站的robots.txt查看是否允许爬虫及爬虫的时间,网站架构。。。
        for i in resultDic:
            print(resultDic[i])#打印文章详情
        total_detail_list.append(resultDic)#添加详情字典到列表
    return total_detail_list

#使用sqlite存储数据,pandas清晰展示数据
def write_data(total_news):
    df = pandas.DataFrame(total_news)#将数据放入pandas中
    with sqlite3.connect('news.sqlite') as db:
        df.to_sql('news', con = db)#将df数据写入数据库

#读取数据
def read_data():
    with sqlite3.connect('news.sqlite') as db:
        df = pandas.read_sql_query('select * from news', con = db)#将数据库数组读出
        print(df)

#入口函数
def main():
    total_news = getTotalNewsDetail()#列表,获取新闻详情
    write_data(total_news)#写入数据库
    read_data()#从数据库读取并打印

if __name__ == '__main__':
    main()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,441评论 25 707
  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,674评论 6 28
  • 各位同学、朋友, 大家好。我们是深泉教育,一家(目前)很小的教育企业,工作地点在南京河西万达写字楼B座(是的,装×...
    6a48142bea13阅读 1,057评论 0 2
  • 我把我们受过的嘲笑, 锻造成盔甲,塞进身体里。 几年后的今天,丢盔弃甲。 看着它们微笑晒太阳, 假装什么都没发生。
    海韵梦都阅读 134评论 2 1
  • 王小欣 文静秀气 却是个身高172的东北女孩,来自长春,在安徽读大学,毕业之后跟我一起留在了杭州这座美丽的城市。她...
    王子小沫阅读 259评论 0 0