日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中接口测试垃圾数据如何清理_一个六年经验的python后端是怎么学习用java写API的(2)Extracter,微信文章抓取清洗入库...

發布時間:2025/3/21 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中接口测试垃圾数据如何清理_一个六年经验的python后端是怎么学习用java写API的(2)Extracter,微信文章抓取清洗入库... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述

pirate 是由我的 django 腳手架 original 實現的,文件上傳提供了七牛和騰訊云兩個 backend,部署提供了默認的配置文件,因此只要關注具體的微信的抓取邏輯即可。

核心表講解

pirate/original/extracter/models.py

微信文章表,正常設計,大字段拆表。

13 class WXArticle(TimeStampedModel):

14 raw_url = models.CharField(max_length=1023)

15 title = models.CharField(max_length=255)

16 cover = models.CharField(max_length=255)

17 description = models.CharField(max_length=255, default='')

18 is_active = models.BooleanField(default=False)

19 is_delete = models.BooleanField(default=False)

98 class WXArticleContent(TimeStampedModel):

99 article_id = models.IntegerField(unique=True)

100 content = models.TextField()

101 body_script = models.TextField(default='')

pirate/original/extracter/models.py

圖片上傳緩存表,因為有時候會重復抓取一篇文章(例如編輯后需要重新寫文章),而每次抓取文章時會將里面的圖片上傳到我們的 cdn,添加上傳文件緩存表來減少重復的圖片上傳操作。

188 class URLFileUploadCache(TimeStampedModel):

189 raw_url = models.CharField(blank=True, default='', max_length=512)

190 url = models.CharField(blank=True, default='', max_length=255)

191 raw_url_md5 = models.CharField(blank=True, default='', max_length=64, db_index=True)

抓取

觀察微信文章發現,文章 div id=js_content 為文章正文,其中標題和 cover 圖在 meta 里面,使用 requests 抓取文章原文,BeautifulSoup 過濾需要的 dom,正則找出需要替換的圖片,upload_handler 選擇七牛去上傳圖片并且替換掉原圖地址。

21 @classmethod

22 def spider_url(cls, raw_url):

23 assert raw_url.startswith('https://mp.weixin.qq.com/') or raw_url.startswith('http://mp.weixin.qq.com/')

24 content = tools.spider_request(raw_url)

25 description = content_text = title = cover = ''

26 body_script = ''

27 if content:

28 b = BeautifulSoup(content, 'html.parser')

29 content_dom = b.find('div', id='js_content')

30 title_dom = b.find('meta', property="og:title")

31 cover_dome = b.find('meta', property="og:image")

32 if title_dom:

33 title = title_dom.attrs['content']

34 if cover_dome:

35 cover = cover_dome.attrs['content']

36 raw_url = cover

37 upload_cache = URLFileUploadCache.get_cached_objects(raw_url, get_last=True)

38 if upload_cache:

39 cover = upload_cache[0].url

40 else:

41 upload_data = tools.upload_file_from_url(raw_url)

42 url = upload_data['url']

43 if url:

44 URLFileUploadCache.new_cache(raw_url, url)

45 cover = url

46 if content_dom:

47 content_text = unicode(content_dom)

48 ss = b.body.find_all('script')

49 body_script = ''.join(unicode(s) for s in ss)

50 urls = []

51 for _re in constants.WEIXIN_IMAGE_RES:

52 urls.extend(_re.findall(content_text))

53 descriptions = constants.WEIXIN_DESCRIPTION_RE.findall(content)

54 if descriptions:

55 description = BeautifulSoup(descriptions[0]).meta.attrs.get('content', '')

56 mapper = {}

57 for raw_url in urls:

58 if raw_url in mapper:

59 continue

60 upload_cache = URLFileUploadCache.get_cached_objects(raw_url, get_last=True)

61 if upload_cache:

62 mapper[raw_url] = upload_cache[0].url

63 else:

64 upload_data = tools.upload_file_from_url(raw_url, )

65 url = upload_data['url']

66 if url:

67 URLFileUploadCache.new_cache(raw_url, url)

68 mapper[raw_url] = url

69 for raw_url, url in mapper.iteritems():

70 if not url:

71 continue

72 content_text = content_text.replace(raw_url, url)

73 return {

74 'raw_url': raw_url,

75 'title': title,

76 'cover': cover,

77 'content': content_text,

78 'description': description,

79 'body_script': body_script,

80 }

上傳文件到七牛的 upload_handler

13 POLICY = settings.FILE_CALLBACK_POLICY or {

14 'callbackUrl': settings.FILEUPLOAD_CALLBACK_URL,

15 'callbackBody': 'bucket=$(bucket)&key=$(key)&filename=$(fname)&filesize=$(fsize)',

16 'insertOnly': 1,

17 }

18

19

20 class UploadHandler(object):

21

22 def __init__(self, key, secret, bucket):

23 self.key = key

24 self.secret = secret

25 self.bucket = bucket

26 self.backend = qiniu

27 self._backend_auth = Auth(self.key, self.secret)

28

29 def _upload_token(self, key, expires=3600, policy=None):

30 token = self._backend_auth.upload_token(self.bucket, key=key, expires=expires, policy=policy)

31 return token

32

33 def upload_file(self, key, data, policy=None, fname='file_name'):

34 if policy is None:

35 policy = POLICY

36 uptoken = self._upload_token(key, policy=policy)

37 return self.backend.put_data(uptoken, key, data, fname=fname)

38

39 def get_download_url(self, key):

40 return '{}{}'.format(settings.FILE_DOWNLOAD_PREFIX, key)

CDN 配置

創建一個公開的存儲空間,名字即 FILE_UPLOAD_BUCKET

為了讓域名好看一些,配置 CDN 加速域名,根據步驟操作即可(有一些 dns 的操作)。FILE_DOWNLOAD_PREFIX

個人中心秘鑰管理獲取 upload_handler 需要的 FILE_UPLOAD_KEY、FILE_UPLOAD_SECRET

執行部署

創建對應 mysql 數據庫

創建 virtualenv,source 后 pip install 項目路徑下的 requirements/base.txt

創建 config/settings/private_production.py,見下面代碼段

數據庫 migrate,cd 到 original 目錄,執行./manage.py migrate --settings=config.settings.production

啟動項目 ./manage.py runserver 0.0.0.0:8976 (端口號隨意)

當然建議用 supervisor + nginx,見deploy目錄下的相關例子

import os

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'dbname', # 改成你的數據庫名字

'HOST': os.environ.get('ORIGINAL_MYSQL_HOST', 'localhost'), # 數據庫host

'USER': os.environ.get('ORIGINAL_MYSQL_USER', 'db_username'), # 改成你的數據庫user

'PASSWORD': os.environ.get('ORIGINAL_MYSQL_PASSWORD', 'db_password'), # 改成你的數據庫password

'PORT': os.environ.get('ORIGINAL_MYSQL_PORT', 3306),

'OPTIONS': {'charset': 'utf8mb4'},

}

}

FILE_UPLOAD_BACKEND = 'qiniu'

FILE_UPLOAD_KEY = 'i6fdSECQjLfF' # 改成你的qiniu key,現在這里是假的

FILE_UPLOAD_SECRET = 'adfiuerqp' # 改成你的qiniu secret

FILE_UPLOAD_BUCKET = 'reworkdev' # 改成你的qiniu bucket

FILE_CALLBACK_POLICY = {}

FILE_DOWNLOAD_PREFIX = '' # 改成你的host, 例如 http://cdn.myhost.com/

FILEUPLOAD_CALLBACK_URL = # 改成你自己host的對應地址, 例如 https://www.myhost.com/api/v1/file/upload/callback/

postman 測試接口

查看數據庫

接下來

基本物料接口準備就緒,下面就可以正式開始 Java 框架的學習。

總結

以上是生活随笔為你收集整理的python中接口测试垃圾数据如何清理_一个六年经验的python后端是怎么学习用java写API的(2)Extracter,微信文章抓取清洗入库...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美孕交视频 | 成人福利午夜 | 精品久久无码视频 | 尹人成人网 | 国产欧美一区二区三区另类精品 | 久操伊人网 | 国产精品有码 | 91精品久久久久久综合五月天 | 国产成人三级一区二区在线观看一 | 91最新入口 | 日日摸夜夜添夜夜 | 一区二区免费播放 | 91禁看片 | 中文字幕精品一区二区三区精品 | 国产精品av网站 | 成人精品亚洲 | 午夜精品久久久久久久久久蜜桃 | 一个色综合导航 | 精品国产一区二区三区四区精华 | 一本av在线 | 日日噜噜噜夜夜爽爽狠狠视频97 | av动漫网站 | 成人毛片在线精品国产 | 色小妹av| 欧美在线小视频 | 交专区videossex非洲 | av高清 | 亚洲成人一区在线 | 男女午夜视频 | 超碰资源 | 欧美午夜精品久久久久久孕妇 | 一级黄色毛毛片 | 国产视频黄色 | 欧美精品久 | 长河落日电视连续剧免费观看01 | 狠狠躁18三区二区一区视频 | 五月深爱 | 超级碰在线视频 | 欧洲人妻丰满av无码久久不卡 | 日在线视频 | 国产东北真实交换多p免视频 | 91亚洲精| 日韩美女三级 | 99久久99久久精品国产片果冰 | 国产又黄又粗的视频 | 视频区图片区小说区 | 亚洲欧美动漫 | 欧亚成人av| 欧洲最强rapper网站直播 | 亚洲av无码专区国产乱码不卡 | 两女双腿交缠激烈磨豆腐 | 国产乱码77777777 | 国模在线视频 | 色乱码一区二区三在线看 | 精品视频在线观看免费 | 蜜桃视频在线观看一区 | 免费观看一区二区三区 | 国产在线xxxx | 久久老熟女一区二区三区 | 欧美黑人xxx | 亚洲图片视频在线 | 色综合成人 | 韩日成人| 九色麻豆 | 丝袜在线一区 | 欧美日韩一二 | 欧美浮力影院 | 欧美少妇诱惑 | 婷婷亚洲综合五月天小说 | 午夜成人亚洲理伦片在线观看 | 国产又粗又黄又爽视频 | 亚洲av女人18毛片水真多 | 韩国美女一区 | 欧美日韩成人精品 | 少妇的激情 | 极品久久久 | 日批免费观看视频 | 国产成人综合精品 | 亚洲精品va | 精品无人国产偷自产在线 | 国内精品视频 | 国产男女视频 | 五月天六月婷婷 | 成年人网站在线免费观看 | 欧美精品久久天天躁 | 西野翔之公侵犯中文字幕 | 蜜臀久久99精品久久久画质超高清 | 法国性xxxx精品hd | 麻豆视频在线观看免费网站黄 | a色网站 | 国产特级黄色录像 | 97超级碰碰人妻中文字幕 | 黄色av国产| 天堂中文av | 不卡中文字幕在线 | 性欧美一区二区 | 中文字幕日韩在线视频 | 福利视频午夜 | 国产精品尤物 |