| 42 | |
| 43 | |
| 44 | class GridWidget(QWidget): |
| 45 | Page = 0 |
| 46 | loadStarted = pyqtSignal(bool) |
| 47 | |
| 48 | def __init__(self, *args, **kwargs): |
| 49 | super(GridWidget, self).__init__(*args, **kwargs) |
| 50 | self._layout = FlowLayout(self) # 使用自定义流式布局 |
| 51 | # 异步网络下载管理器 |
| 52 | self._manager = QNetworkAccessManager(self) |
| 53 | self._manager.finished.connect(self.onFinished) |
| 54 | |
| 55 | def load(self): |
| 56 | if self.Page == -1 or self.Page > 10: |
| 57 | return |
| 58 | self.loadStarted.emit(True) |
| 59 | # 延迟一秒后调用目的在于显示进度条 |
| 60 | QTimer.singleShot(1000, self._load) |
| 61 | |
| 62 | def _load(self): |
| 63 | print("load url:", Url.format(self.Page * 35)) |
| 64 | url = QUrl(Url.format(self.Page * 35)) |
| 65 | req = QNetworkRequest(url) |
| 66 | req.setRawHeader(b"User-Agent", Agent) |
| 67 | self._manager.get(req) |
| 68 | |
| 69 | def onFinished(self, reply): |
| 70 | # 请求完成后会调用该函数 |
| 71 | req = reply.request() # 获取请求 |
| 72 | iwidget = req.attribute(QNetworkRequest.User + 1, None) |
| 73 | path = req.attribute(QNetworkRequest.User + 2, None) |
| 74 | html = reply.readAll().data() |
| 75 | reply.deleteLater() |
| 76 | del reply |
| 77 | if iwidget and path and html: |
| 78 | # 这里是图片下载完毕 |
| 79 | open(path, "wb").write(html) |
| 80 | iwidget.setCover(path) |
| 81 | return |
| 82 | # 解析网页 |
| 83 | self._parseHtml(html) |
| 84 | self.loadStarted.emit(False) |
| 85 | |
| 86 | def _parseHtml(self, html): |
| 87 | # print(html) |
| 88 | # encoding = chardet.detect(html) or {} |
| 89 | # html = html.decode(encoding.get("encoding","utf-8")) |
| 90 | html = HTML(html) |
| 91 | # 查找所有的li list_item |
| 92 | lis = html.xpath("//ul[@id='m-pl-container']/li") |
| 93 | # print(lis) |
| 94 | if not lis: |
| 95 | self.Page = -1 # 后面没有页面了 |
| 96 | return |
| 97 | self.Page += 1 |
| 98 | self._makeItem(lis) |
| 99 | |
| 100 | def _makeItem(self, lis): |
| 101 | for li in lis: |